java - Windows 在重叠时删除 JFrame 的内容

标签 java swing jframe jpanel paintcomponent

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

我错过了什么吗?

最佳答案

直接绘制到 JFrame 不是好的做法。更好的方法是覆盖 JPanel 中的 paintComponent() 并将 JPanel 添加到 JFrame:

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

我的面板.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 并在 JFrame 实例被引入时调用 repaint()焦点:http://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html

通过方法 windowGainedFocus(WindowEvent e)windowStateChanged(WindowEvent e)windowActivated(WindowEvent e) 调用 repaint( ) 其中一个方法将调用 paint() 方法。

关于java - Windows 在重叠时删除 JFrame 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11957107/

相关文章:

java - JPanel 如何创建实例/对象

java - 如何使用java更新mongodb文档中的特定值

java - 从单个对象继承的不同类型的集合与单个 super 对象的集合

java - 如何通过选择行并单击“删除”使 Swing 从表中删除条目?

java - jButton 仅响应第二次单击

java - 如何验证只显示小于 JFrame 的几何形状

java - 一个变量可以在一条语句中递增多少次?

java - 分数到循环小数

java - 想要在标签中显示日期

java - 使用 Java 关闭 GUI