1

私は自分でスイングを学び始めたばかりですが、なぜ私のイベントがここで機能しないのか少し混乱しています:

1.ユーザーがメニューバーをクリックした場合、パネルからすべてを削除しようとしています->ロードしますが、イベント内で使用しているため、パネルを最終的に変更する必要があります!

2. イベントで新しいパネルを定義し、そのパネルに追加するコンテナをさらに 2 つ定義してからメイン フレームに追加しましたが、何も起きていないようです。

何が悪いのかわかる方いましたら教えてください。乱雑なコードで申し訳ありません。ヒントをいただければ幸いです。

public class SimpleBorder {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                myFrame frame = new myFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true); 
            }
        });
    }
}

class MyFrame extends JFrame {

    public MyFrame()
    {

        setSize(500,500);   
        JPanel panel = new JPanel();

        panel.setLayout(null);
        JLabel label = new JLabel("my name is bernard...");
        Color myColor = new Color(10, 150, 80);
        panel.setBackground(myColor);
        label.setFont(new Font("Serif", Font.PLAIN, 25));
        Dimension size = label.getPreferredSize();
        Insets insets = label.getInsets();
        label.setBounds(85+insets.left, 120+insets.top , size.width, size.height);

        panel.add(label);

        JMenuBar menu = new JMenuBar();
        setJMenuBar(menu);


        JMenu col = new JMenu("Collection");
        menu.add(col);

        JMenu help = new JMenu("Help");
        menu.add(help);

        Action loadAction = new AbstractAction("Load")//menu item exit goes here
        {
            private static final long serialVersionUID = 1L;
            public void actionPerformed(ActionEvent event)
            {
                JTextArea text = new JTextArea(10, 40);
                JScrollPane scrol1 = new JScrollPane(text);
                String[] items = {"A", "B", "C", "D"};          
                JList list = new JList(items);
                JScrollPane scrol2 = new JScrollPane(list);
                JPanel panel2 = new JPanel(new BorderLayout());
                panel2 = new JPanel(new GridLayout(1, 2 ));
                panel2.add(scrol1,BorderLayout.WEST);
                panel2.add(scrol2,BorderLayout.EAST);
                add(panel2);        
            }
        };
        JMenuItem load = new JMenuItem(loadAction);
        col.add(load);
        add(panel);

    }

}
4

1 に答える 1

3

新しいパネルを追加した後、インスタンスでrevalidate()/repaint()を呼び出します。JFrame

JPanel panel2 = new JPanel(new BorderLayout());
// panel2 = new JPanel(new GridLayout(1, 2 ));//why this it will overwrite the above layout
panel2.add(scrol1,BorderLayout.WEST);
panel2.add(scrol2,BorderLayout.EAST);
add(panel2);  
revalidate();
repaint();

また、インスタンスを呼び出しpack()JFrame、すべてのコンポーネントがレイアウトマネージャーによって配置されるようにします。コメントで述べたように、JFrame クラスを拡張しないでください。フレームの変数を作成し、フレーム インスタンスで必要なすべてを開始し、ハードワークが好きでない限り、レイアウトを null に設定しないでください :P

または、mKorbel が述べたように、CardLayoutJPanelが必要な場合があります。単一のものを使用して、他のものと新しいものを切り替えることができます。

JPanel cards;
final static String BUTTONPANEL = "Card with JButtons";
final static String TEXTPANEL = "Card with JTextField";

//Where the components controlled by the CardLayout are initialized:
//Create the "cards".
JPanel card1 = new JPanel();
...
JPanel card2 = new JPanel();
...

//Create the panel that contains the "cards".
cards = new JPanel(new CardLayout());
cards.add(card1, BUTTONPANEL);
cards.add(card2, TEXTPANEL);

//add card panel to frame
frame.add(cards);

//swap cards
CardLayout cl = (CardLayout)(cards.getLayout());//get layout of cards from card panel
cl.show(cards, TEXTPANEL);//show another card
于 2012-09-18T16:43:45.757 に答える