我使用JFrame创建并显示一个窗口,并将其设置为非常基本的属性。
public FrameVertices( String sTitle, Graph mMap, int iMul ) {
super( sTitle );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize ( 300, 300 );
setLocation ( 600, 300 );
setVisible ( true);
this.iMul = iMul;
this.gGraph = mMap;
}
然后我使用 paint()方法在窗口内绘制一些东西。
问题在于,当其他一些窗口覆盖我的JFrame
然后揭开它时,JFrame
的内容不会被重新绘制 - 除非我调整JFrame
的大小或最小/最大值。
我错过了什么吗?
答案 0 :(得分:7)
直接绘制到JFrame
并不是一种好习惯。更好的方法是覆盖paintComponent()
中的JPanel
并将JPanel
添加到JFrame
:
Test.java:
public class Test extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Test().createUI();
}
});
}
void createUI() {
setSize(500,500);
getContentPane().add(new MyPanel());
setVisible(true);
}
}
MyPanel.java:
class MyPanel extends JPanel {
@override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//paint what you want here
g.drawString("Hello world",250,250);
}
}
但是,如果必须,我建议添加一个窗口FocusListener
,并在repaint()
实例引起关注时调用JFrame
:http://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html
通过方法windowGainedFocus(WindowEvent e)
或windowStateChanged(WindowEvent e)
或windowActivated(WindowEvent e)
调用其中一种方法中的repaint()
,然后调用paint()
方法。
答案 1 :(得分:1)
正如David在前面的回答中所建议的那样,这不是一个很好的方式来解决Swing的问题,但是如果你不得不这样做,或者想要这样做,你可能想要使用WindowListener
接口(或者WindowAdapter
类,如果你想简化重写方法的任务,并使用windowActivated
或windowDeactivated
函数以某种方式调用repaint()
方法。
这是文档:WindowListener#windowDeactivated
编辑:
从给定的代码示例中,您似乎已经扩展了JFrame
类,因此您唯一的选择是实现WindowListener
接口。