1

私は、JTextFields、JCheckBoxes、および JComboBoxes の量と順序が可変で、それらのいくつかのグループを含む個別の JPanel を使用して、従来のフォーム GUI を構築しています。

今のところ、JLabel + 適切な入力要素を JPanel に追加し、JPanel をメインの初期化メソッドに返すビルダー メソッドでそれらを構築するだけです。

したがって、私は要素にのみアクセスできます

Component[] panels = frame.getContentPane().getComponents();  
JPanel panel = (JPanel) panels[f];  
Component[] components = panel.getComponents();  

[...] determining the element class  
JTextField field = (JTextField) components[u + 1]

この方法では読み取りは問題なく機能しますが、現在要素に直接アクセスしていないため、値の設定は困難です。何か間違ったことをしているのですか、それとも最初からパネルを再構築する必要がありますか?

4

2 に答える 2

2

あなたは悪いことをしているわけではありません。あなたは正しい道を進んでいます。実際、これは通常行われている方法です。

あなたの GUI はいくつかのクラスにあります - そして、その GUI のどの要素が「インタラクティブ」であるかを決定する必要があります - つまり、後で実行中にいくつかのアクションが行われます。それらは、テキスト フィールド、ボタンなどのコントロール要素である可能性があります。また、インタラクティブではなく、作成後に使用されない要素もあります。それらはラベル、パネルなどです...それらの目的は、GUIにペイントすることだけです。

したがって、どの要素が「重要な」要素であるかを判断するときは、それらの要素をローカル変数からクラス フィールドに昇格させるだけです。適切な IDE (NetBeans や Eclipse など) を使用している場合は、[リファクタリング] タブの下にそのオプションが表示されます。それにもかかわらず、結果は次のようになります。

public class GUI{
    public void create GUI{
        //code before...
        JTextField field = new JTextField();
        //code after...
    }
}

次のように変更されます。

public class GUI{
    private JTextField textField;

    public void create GUI{
        //code before...
        textField = new JTextField();
        //code after...
    }
}

または、これらのフィールドの量が可変である場合は、配列またはコレクションで宣言できます。

public class GUI{
    private JTextField[] textFields;

    public void create GUI{
        //code before...
        for(int i = 0; i < dbResultCount; i++){
            textFields[i] = new JTextField();
        }
        //code after...
    }
}
于 2012-10-10T12:48:52.023 に答える
1

あなたが使用しているアプローチは、良い考えのようには聞こえません。このアプリケーションを維持するのは本当に難しいでしょう。

コンポーネントの一部にアクセスする必要がある場合は、それらをインスタンス変数として宣言することをお勧めします。

于 2012-10-10T12:48:26.430 に答える