6

この「メイン」パネル (これをAAAと呼びましょう) と BorderLayout があり、その中に 2 つのパネル ( BBBCCC ) があります。

public class AAA extends JPanel {
    BBB pnlNorth = new BBB();
    CCC pnlCenter = new CCC();
    public AAA(){
        setLayout(new BorderLayout());
        add(pnlNorth,BorderLayout.NORTH);
        add(pnlCenter,BorderLayout.CENTER);        
    }
}

Panel CCCは現在空で、GridLayout があります。

私のパネルBBBは次のようになります。

public class BBB extends JPanel {
    public BBB (){
        JLabel labNum = new JLabel("Number of items: ");
        JTextField txtNum = new JTextField();
        JButton cmdOK = new JButton("OK");
        txtNum.setColumns(5);
        cmdOK.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                /* ???????????? */
            }
        });
        add(labNum);
        add(txtNum);
        add(cmdOK);        
    }
}

ユーザーが txtNum に数値を入力して「OK」を押すと、パネルCCCにデータ入力用の適切な行数が表示されます。各行には、2 つのテキスト フィールド、2 つのドロップダウン リスト、およびチェックボックスが含まれている必要があります。ユーザーが大きな数値を入力した場合、すべての項目が JScrollPane にあると便利です。

私の質問: BBBでアクション リスナーを実装するにはどうすればよいですか? ユーザーが入力する番号はわかりません。したがって、 CCCの GridLayoutの正確な行数はわかりません(5 列にする必要があることだけはわかっています)。BBBのリスナーからレイアウトを変更できますか? また、パネルBBBのリスナーからパネルCCCにコンポーネントを追加するにはどうすればよいですか?

もちろん、(2 つの別々のパネルなしで) より良い解決策がある場合は、お知らせください:)

4

2 に答える 2

7

あなたはこれを間違って考えているかもしれません。通信している2つのJPanelではなく、より単純な2つのオブジェクトについて考える方がおそらく良いでしょう。それらは通信しており、状態に影響を与えるメソッドを介して、他の2つのオブジェクトとまったく同じように通信します。この情報は、一方のオブジェクトが他方のメソッドを呼び出してその情報を公開することにより、あるオブジェクトから別のオブジェクトにプッシュすることができます。または、達成できるようなオブザーバーデザインパターンを使用して、あるオブジェクトから別のオブジェクトにプルすることができます。利用可能なさまざまなリスナーの1つを使用します。私自身、これにはPropertyChangeListenerを使用するのが好きです。したがって、監視対象オブジェクトは、状態が変更されると通知されるリスナーを受け入れ、これらのオブザーバーは、監視対象のパブリックメソッドを呼び出して、変更された情報を抽出します。

たとえば、この回答のコードを確認するか、この質問に対する回答をさらに改善してください。

于 2013-01-06T20:23:53.263 に答える
1

私はこれを行うことができました。北パネルのコンストラクターで、中央パネルをパラメーターとして渡すだけです。それは完全に機能します。回答ありがとうございました:)

于 2013-01-06T20:59:24.373 に答える