【发布时间】:2013-06-26 23:13:47
【问题描述】:
我有一个非常基本的小 JFrame,它带有 JToggleButtons 和子类 JPanel,它们知道如何绘制我希望它们绘制的内容。选择一个按钮会导致一个椭圆出现在相应的面板中。取消选择按钮会使绘图消失。
不幸的是,最小化(图标化)然后恢复(去图标化)会导致任何绘制的形状消失。所以我需要手动触发重绘。问题是,如果我先显示一个消息框,我只能完成重绘(也就是说,我只能看到它)。
这是 JFrame 的 deiconify 事件:
private void formWindowDeiconified(java.awt.event.WindowEvent evt)
{
//having this message makes everything work
JOptionPane.showMessageDialog(null, "Useless message this is.");
//but if I skip it, I'm SOL
//what's going on?
drawAll();
}
此方法遍历我的所有按钮,并在必要时要求重绘:
public void drawAll()
{
for (int i=0; i<channels; i++)
{
if (buttons[i].isSelected())
{
lightboxes[i].drawMe();
}
}
}
这是我的子类 JPanel:
class MyJPanel extends JPanel {
public void drawMe()
{
Graphics myGraphics = this.getGraphics();
myGraphics.fillOval(0, 0, this.getWidth(), this.getHeight());
}
public void unDraw()
{
this.invalidate();
this.repaint();
}
}
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
我听说过这些,但我认为在这种情况下不实用。它最终变得无关紧要 - 重点是我应该在组件的 paintComponent 事件中进行绘制并让 Swing 处理细节。
标签: java swing graphics jframe windowlistener