4

我使用 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.

我错过了什么吗?

4

2 回答 2

7

直接绘制到JFrame. 更好的方法是覆盖paintComponent()aJPanel 并将其添加JPanelJFrame

测试.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);
    }
}

但是,如果必须,我建议添加一个 Window并在它成为焦点时FocusListener调用实例:http: //docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.htmlrepaint()JFrame

通过方法windowGainedFocus(WindowEvent e)windowStateChanged(WindowEvent e)windowActivated(WindowEvent e)调用repaint()这些方法之一然后将调用该paint()方法。

于 2012-08-14T17:28:02.900 回答
1

正如大卫在较早的回答中所建议的那样,这不是处理 Swing 东西的好方法,但如果你必须这样做,或者以某种方式想要这样做,你可能想要使用WindowListener接口(或WindowAdapter类,以防你想简化覆盖方法的任务)并使用windowActivatedorwindowDeactivated函数以某种方式调用该repaint()方法。这是文档:WindowListener#windowDeactivated

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

于 2012-08-14T17:36:54.927 回答