2012-05-05 15 views
2

次のJFrameがあります。JFrameに複数のJPanelを追加できません。

public class AddActivityWindow extends JFrame { 

    //declaration of components go here 
    ... 
    public AddActivityWindow(ActivityStore store) { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel pnl_date = new JPanel(); 
     JLabel lbl_date = new JLabel("X"); 
     pnl_date.add(lbl_date); 
     add(pnl_date); 


     pnl_activities = new JPanel(); 
     JLabel lbl_act = new JLabel("Y"); 
     pnl_activities.add(lbl_act); 
     add(pnl_activities); 

     setLocationRelativeTo(null); 
     setVisible(true); 

    } 
} 

このフレームを作成すると、2枚のパネルでフレームが作成されると予想していました。しかし、2番目のパネルのみが表示されます(つまり、は画面に表示され、Xは表示されません)。しかし、2番目のパネルのコードを削除すると、Xが表示されます。

2番目のパネルを追加するとどうなりますか?最初のパネルがフレームに表示されないのはなぜですか?

+3

は、そうでない場合、彼らは間違いなく、互いに重複し、それにパネルを追加する前に、JFrameの上のいくつかの 'layout'を使用します。.. – Asif

答えて

6

別のレイアウトマネージャを使用する必要があります。見てみましょう:A Visual Guide to Layout Managersを選択してください。これは私のために正常に動作

import java.awt.FlowLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class FrameTest extends JFrame { 

    public FrameTest() { 
     setLayout(new FlowLayout()); 
     setSize(150, 150); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel pnl_date = new JPanel(); 
     JLabel lbl_date = new JLabel("X"); 
     pnl_date.add(lbl_date); 
     add(pnl_date); 


     JPanel pnl_activities = new JPanel(); 
     JLabel lbl_act = new JLabel("Y"); 
     pnl_activities.add(lbl_act); 
     add(pnl_activities); 

     setLocationRelativeTo(null); 
     setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new FrameTest().setVisible(true); 

      } 
     }); 
    } 
} 
7

JFrameのデフォルトレイアウトはBorderLayoutです。 BorderLayoutの特徴は、各領域に1つのコンポーネントしか含まれていないことです。制約を指定せずにaddメソッドを使用するだけの場合は、CENTERにコンポーネントを追加することと同じです。つまり、最初に追加した要素が2番目のadd呼び出しに置き換えられます。

考えられる解決策:例えば

add(pnl_date, BorderLayout.NORTH); 
//... 
add(pnl_activities, BorderLayout.CENTER); 

たりJFrameのための別のレイアウトマネージャ(例えばBoxLayoutまたはFlowLayout)に切り替え、制約を指定します。それはあなたのニーズに依存します。マネージャを選ぶのに適した開始点はVisual guide to layout managersです。

関連する問題