2016-03-18 19 views
0

JFrameMyFrame)を拡張するクラスとJPanelMyPanel)を拡張するクラスの2つのクラスがあります。この考え方は、MyPanelクラスのインスタンスを既存の可視インスタンスMyFrameに追加できるようにすることです。JPanelを拡張するクラスはUIを更新しません

public class MyFrame extends JFrame { 
    public MyFrame() { 
     setVisible(true); 
     JPanel panel = new MyPanel(); 
     add(panel); 
    } 
} 

public class MyPanel extends JPanel { 
    public MyPanel() { 
     add(new JButton("Test")); 
    } 
} 

public class Program { 
    public static void main (String[] args) { 
     new MyFrame(); 
    } 
} 

コードは実行されてもエラーは発生しませんが、MyPanelがMyFrameに追加されてもUIは更新されません。

+0

'repaint()'と 'pack()'を試したことがありますか? –

+0

ああ、 'pack()'はJPanel要素をうまく表示しますが、レイアウトをかなり大きくねじ込みます。現在のレイアウトに影響を与えずにこれを達成する他の方法はありますか? – ryansin

+0

@ user2696497レイアウトマネージャーを変更してください – MadProgrammer

答えて

3

同様の問題に関する他の質問と同様に、setVisible(true);をコンストラクタの最後に移動します。

のような何か...

public class MyFrame extends JFrame { 

    public MyFrame() { 
     JPanel panel = new MyPanel(); 
     add(panel); 
     pack(); 
     setVisible(true); 
    } 
} 

Swingのレイアウトは怠惰されている、彼らはあなたがそれらを伝えるまでは更新されません(またはトップレベルのコンテナのようないくつかの他のアクションは、/ reshownリサイズされたことは起こる)

packを使用して、コンテンツのサイズ要件に基づいてウィンドウの初期サイズを指定する必要があります。

JFrameのようなトップレベルのコンテナからの拡張を避けるべきです。実際にクラスに新しい機能を追加するのではなく、必要なときに新しいインスタンスを作成するだけです。 ..

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       ex.printStackTrace(); 
      } 

      JFrame frame = new JFrame("Testing"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(new MyPanel()); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

お返事ありがとうございます。残念ながら 'setVisible(true)'を追加しようとしました。 – ryansin

+1

@ user2696497:いいえ、「setVisible(true)」を追加せず、代わりに***を*** MyFrameコンストラクタの最後に移動します。それでも問題が解決しない場合は、最新の機能していないコードを使用して質問を編集してください。 –

+0

@ user2696497あなたはどこに入れましたか?コンストラクタの開始時に?私はあなたがコンストラクタの終わりにそれを置くべきであることを示唆した – MadProgrammer

関連する問題