Java 调用其他组件的重绘

Java 调用其他组件的重绘,java,swing,graphics,repaint,Java,Swing,Graphics,Repaint,我正在为大学做一些小型Java程序,在更新后我遇到了重新绘制一些图形的问题。以下是上下文: 我有一个主要的Jframe,它基本上包含两个东西,一个用于绘制/绘制一些图形(矩形、圆形等)的JComponent和一个为用户提供排序选项的JMenu JComponent覆盖了paintComponent,因此我可以根据请求绘制图形。图形是自定义类,具有定义图形类型的方法,每个类都将调用自己的drawRect()或drawOval()。这很有效。如果我为主JFrame调用repaint(),它将按预期调

我正在为大学做一些小型Java程序,在更新后我遇到了重新绘制一些图形的问题。以下是上下文:

我有一个主要的Jframe,它基本上包含两个东西,一个用于绘制/绘制一些图形(矩形、圆形等)的JComponent和一个为用户提供排序选项的JMenu

JComponent覆盖了paintComponent,因此我可以根据请求绘制图形。图形是自定义类,具有定义图形类型的方法,每个类都将调用自己的drawRect()或drawOval()。这很有效。如果我为主JFrame调用repaint(),它将按预期调用JComponent()的paintComponent

JMenu中的一个菜单具有按不同顺序对图形排序的选项。所以在每个选项的ActionListner中,我继续使用包含图形的LinkedList

问题是,当我在ActionListener中完成排序时,我会调用repaint()在JComponent中绘制图形,但它会调用JMenu的repaint()。。。所以我的问题是如何从JMenu调用JComponent的重新绘制


谢谢。

关键是确保调用代码对被调用代码的查看对象有一个干净的引用。换句话说,菜单的侦听器代码需要对绘图JComponent的引用,通常放在侦听器类的字段中。你如何传递它将取决于你的程序结构。这可以通过构造函数参数来完成,或者如果您希望更简洁,可以通过依赖项注入来完成

JMenu中的一个菜单具有按不同顺序对图形排序的选项。所以在每个选项的ActionListner中,我继续使用包含图形的LinkedList

然后该代码应该在组件上调用repaint()。也就是说,链接列表应该是绘制图形的组件的一部分。因此,您可以在组件上调用类似于
sort(…)
的方法。然后,该方法将对组件进行排序,然后重新绘制()


这是所有Swing方法的工作方式,如
setText(…)
setBackground(…)
。您在组件上调用这些方法,然后组件在其自身上调用
repaint()

现在您已经提到了这一点,这一点非常明显!Thank=D它能在不将整个JComponent传递给JMenu的构造函数或方法的情况下完成吗?@JulioQc:您需要传入某个对象,该对象的方法会以某种方式改变JComponent的状态。