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、のコンテンツが再描画されないことです。JFrameJFrame

私は何かが足りないのですか?

4

2 に答える 2

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を呼び出すことをお勧めします:http: //docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.htmlrepaint()JFrame

メソッドを介して、windowGainedFocus(WindowEvent e)またはこれらのメソッドの1つを呼び出すと、メソッドが呼び出さwindowStateChanged(WindowEvent e)windowActivated(WindowEvent e)ます。repaint()paint()

于 2012-08-14T17:28:02.900 に答える
1

以前の回答でDavidが示唆したように、これはSwingに関する作業を行うのに適した方法ではありませんが、必要な場合、または何らかの方法でそうしたい場合は、WindowListenerインターフェイス(またはWindowAdapter、単純化する場合はクラス)を使用することをお勧めします。メソッドをオーバーライドするタスク)、windowActivatedまたはwindowDeactivated関数を使用してメソッドを呼び出しますrepaint()。ここにドキュメントがあります:WindowListener#windowDeactivate

編集:与えられたコード例から、あなたはクラス
を拡張したようです、それであなたの唯一のオプションはインターフェースを実装することです。JFrameWindowListener

于 2012-08-14T17:36:54.927 に答える