2

次のJFrameがあります。

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つのパネルを持つフレームが作成されることを期待していました。Yただし、2番目のパネルのみが表示されます(つまり、画面にのみ表示され、表示されません) X。ただし、2番目のパネルのコードを削除すると、が表示されますX

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

4

2 に答える 2

7

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

考えられる解決策: 制約を指定します。

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

BoxLayoutまたは、別のレイアウト マネージャー ( aまたは a など) に切り替えFlowLayoutますJFrame。それはあなたのニーズに依存します。マネージャーを選択するための良い出発点である、レイアウト マネージャーのビジュアル ガイドをご覧ください。

于 2012-05-05T07:09:26.143 に答える
6

別の Layout Manager を使用する必要があります。次を参照してください: 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);

            }
        });
    }
}
于 2012-05-05T07:17:06.337 に答える