1

次のクラスは、JPanelコンテナーを含むウィンドウを作成します。このコンテナには、JPanelで満たされJTextFieldsJPanelとが入った が含まれJButtonています。次のようになります。 私の窓の写真

JTextFieldボタンをクリックすると、左に別のボタンを追加したいのですが、JPanelどうすればよいのでしょうか。するべきか:

  • JPanel何らかの方法で既存の左を変更しますか?

  • より大きな GridLayout を使用して新しいものを作成し、JPanel必要なもの (現在の項目 + 追加JTextField) を追加してJPanelから、ウィンドウに追加して、何らかの方法で現在のJPanel?

  • 何か他のことをしますか?

以下は私のコード全体です。必要に応じて、コピーして貼り付けて実行します。どんな助けでも大歓迎です!


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;    
public class PanelUpdateTest {
    public static void main(String[] args){
        int row = 4;
        int col = 6;

        JFrame frame = new JFrame();                //the Window
        JPanel container = new JPanel();            //A panel that contains all components

        JPanel buttonPanel = new JPanel();          
        JButton button = new JButton("Add Text Field");     
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){             
                System.out.println("Button \"Add Text Field\" was clicked.");
                //here i want code to add another JTextField to the window.
            }
        });     
        buttonPanel.add(button);

        container.add(createPanel(row, col));
        container.add(buttonPanel);

        frame.add(container);       

        frame.pack();
        frame.setVisible(true);     
    }

    /**
     * This method returns a JPanel filled with JTextFields.
     */
    public static JPanel createPanel(int row, int col){
        JPanel jp = new JPanel();
        jp.setLayout(new GridLayout(row, col));
        for(int i = 0; i < row*col; i++){
            jp.add(new JTextField("  Text  "));
        }       
        return jp;
    }
}
4

3 に答える 3

1

わかりました。この問題を解決するための推奨事項がいくつかあります。何よりもまず、パネルを実際に表示する手段です。後続の行にパネルを連続して追加し続けると、サイズを変更しないとフレーム内にすべてが表示されません。

このため、 からJScrollPane返されたパネルを収納するには、 を使用することをお勧めしますcreatePanelここでドキュメントを読むことができます。

次は、これを使用する問題ですGridLayout。テキスト フィールドに必要な行数を定義するのは素晴らしいことですが、 で指定する必要はありませんGridLayout。レイアウトでいずれかのパラメーターを 0 として定義すると、その方向に継続的に塗りつぶされます。だから、私はに置き換えnew GridLayout(row, col)ますnew GridLayout(0,col)。そうすれば、列はいっぱいになりますが、行は無制限にできます。

ここで、JPanelテキスト フィールドを変更して追加するには、アクセス権を提供する必要があります。このため、JPanel jp静的変数にして、メソッド内で単純にインスタンス化することをお勧めします。

なぜ静的にするのですか?すべての静的メソッドを扱っており、 の内部へのアクセスを提供する必要があるためですActionListener。インターフェイスを実装した派生クラスでこれをすべて行っていた場合JFrameは、インスタンス変数を使用して行うことができます。

コードは次のようになります。

public static JPanel jp = null;
public static JPanel createPanel(int row, int column)
{
    jp = new JPanel();
    //etc etc
}

最後に、実際に追加していますJTextFields。内でこれを行うには、まずが null でないActionListenerことを確認します。jp次に、テキスト フィールドを追加して、 を呼び出しますjp.revalidate();。これにより、更新が強制的に表示されます。

これがあなたにとって理にかなっていることを願っています! コードに関する他の質問や、この方法で私が持っている理由に喜んで答えてください!

于 2013-06-24T15:54:59.233 に答える
1

•より大きな GridLayout で新しい JPanel を作成する

より大きな GridLayout は必要ありません。コンポーネントをパネルに追加/削除すると、レイアウトが動的に変化します。

6 つの JTextField を持つ 4 つの行と、1 つの JTextField を持つ 5 つの行が必要です。

次のように GridLayout を作成します。

JPanel = new JPanel( new GridLayout(0, 6) );

次に、25 個のテキスト フィールドをパネルに追加します。特定の行に 6 番目のコンポーネントが追加されると、レイアウトは自動的に折り返されます。

于 2013-06-24T19:27:09.717 に答える
0

java.awt.Component の paint()/repaint()/update() メソッドを見るべきだと思います。 オラクルのドキュメント

于 2013-06-24T15:28:28.727 に答える