Windows重叠时会擦除JFrame的内容

时间:2012-08-14 16:51:11

标签: java swing jframe

我使用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的大小或最小/最大值。

我错过了什么吗?

2 个答案:

答案 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()实例引起关注时调用JFramehttp://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类,如果你想简化重写方法的任务,并使用windowActivatedwindowDeactivated函数以某种方式调用repaint()方法。 这是文档:WindowListener#windowDeactivated

编辑:
从给定的代码示例中,您似乎已经扩展了JFrame类,因此您唯一的选择是实现WindowListener接口。