调用其他组件的重绘

时间:2014-06-06 20:56:04

标签: java swing graphics repaint

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

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

JComponent会覆盖paintComponent,因此我可以根据请求绘制Graphics。图形是海关类,其中包含定义Graphic类型的方法,每个类都将调用自己的drawRect()或drawOval()。这非常有效。如果我为主JFrame调用repaint(),它将按预期调用JComponent()的paintComponent。

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

问题是当我在ActionListener中完成排序时,我会调用repaint()在JComponent中绘制Graphics但它会调用JMenu的repaint()而不是......所以我的问题是如何不知何故从JMenu调用JComponent的重绘?

感谢。

2 个答案:

答案 0 :(得分:2)

  

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

然后该代码应该在组件上调用repaint()。那就是LinkList应该是绘制Graphics的组件的一部分。因此,您将在组件上调用sort(...)之类的方法。然后该方法将进行排序,然后重新绘制()组件。

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

答案 1 :(得分:1)

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