1

私のアプリには、いくつかの JPanel (10 以上) があり、それぞれにわずかな変更 (追加のボタン、ラベルなど) があります。

したがって、私の考えは、共通の要素(3つのボタン、3つのラベル、3つのテキストフィールド-それらは同じ場所のすべてのパネルにあり、もちろん異なるデータがあります)を持つPanelクラスを作成することでした-以下の私の例では、1つのボタン、1つのラベルのみおよび 1 つのテキストフィールド。

そして、私のメインクラスでは、私が手動で作成したこのパネルのように、ラベルの名前を変更し、テキストフィールドに値を設定したいと思います:

 p1.btn1.setText("TEST");

私の説明を理解していただければ幸いです..ありがとう。

これを正しく行うための最良の方法は何ですか?

ここに画像の説明を入力

私がこれまでに行ったこと:

public class Main {

JFrame f;

Panel1 p1;
Panel2 p2;
Panel3 p3;

JButton btn2, btn3;
JPanel panel2, panel3;
JLabel lblSpeed2, lblSpeed3;
JTextField txtSpeed2, txtSpeed3;

public Main() {

    f = new JFrame();
    f.setSize(500, 500);
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.setLocationRelativeTo(null);
    f.setVisible(true);

    p1 = new Panel1();
    p2 = new Panel2(btn2, panel2, lblSpeed2, txtSpeed2, "Panel no. 2");
    p3 = new Panel3(btn3, panel3, lblSpeed3, txtSpeed3, "Panel no. 3");

    f.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    c.anchor = GridBagConstraints.WEST;
    c.insets = new Insets(5, 5, 5, 5);
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.0;
    c.weighty = 0.0;
    c.gridx = 0;
    c.gridy = 0;
    f.add(p1, c);
    c.gridx = 0;
    c.gridy = 1;
    f.add(p2, c);
    c.gridx = 0;
    c.gridy = 2;
    f.add(p3, c);

    p1.btn1.setText("TEST");

}

public static void main(String[] args) {

    Main m = new Main();

}
  }

手動で作成したパネル:

public class Panel1 extends JPanel {

JButton btn1;
JPanel panel1;
JLabel lblSpeed1;
JTextField txtSpeed1;
Border blackline;

public Panel1() {

    super();

    blackline = BorderFactory.createLineBorder(Color.gray);

    panel1 = new JPanel(new GridBagLayout());
    panel1.setBorder(blackline);
    panel1.setBorder(BorderFactory
            .createTitledBorder("Manually created Panel"));

    btn1 = new JButton("Btn 1");
    lblSpeed1 = new JLabel("Speed");
    txtSpeed1 = new JTextField(5);

    GridBagConstraints c = new GridBagConstraints();

    c.anchor = GridBagConstraints.WEST;
    c.insets = new Insets(5, 5, 5, 5);
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.0;
    c.weighty = 0.0;
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 4;
    panel1.add(btn1, c);

    c.gridwidth = 1;
    c.gridx = 0;
    c.gridy = 1;
    panel1.add(lblSpeed1, c);

    c.gridx = 1;
    c.gridy = 1;
    panel1.add(txtSpeed1, c);

    add(panel1);

}

}

別のパネルのテンプレート:

public class Panel extends JPanel {

Border blackline;

public Panel(JButton btnSend, JPanel MPanel, JLabel lblSpeed,
        JTextField txtSpeed, String Name) {

    super();

    blackline = BorderFactory.createLineBorder(Color.gray);

    MPanel = new JPanel(new GridBagLayout());
    MPanel.setBorder(blackline);
    MPanel.setBorder(BorderFactory.createTitledBorder(Name));

    btnSend = new JButton("Btn 1");
    lblSpeed = new JLabel("Speed");
    txtSpeed = new JTextField(5);

    GridBagConstraints c = new GridBagConstraints();

    c.anchor = GridBagConstraints.WEST;
    c.insets = new Insets(5, 5, 5, 5);
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.0;
    c.weighty = 0.0;
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 4;
    MPanel.add(btnSend, c);

    c.gridwidth = 1;
    c.gridx = 0;
    c.gridy = 1;
    MPanel.add(lblSpeed, c);

    c.gridx = 1;
    c.gridy = 1;
    MPanel.add(txtSpeed, c);

    add(MPanel);

}
}

そして最後に私のパネルクラス:

public class Panel2 extends Panel {

public Panel2(JButton btnSend, JPanel MPanel, JLabel lblSpeed,
        JTextField txtSpeed, String Name) {
    super(btnSend, MPanel, lblSpeed, txtSpeed, Name);
    // TODO Auto-generated constructor stub
}
}

public class Panel3 extends Panel {

public Panel3(JButton btnSend, JPanel MPanel, JLabel lblSpeed,
        JTextField txtSpeed, String Name) {
    super(btnSend, MPanel, lblSpeed, txtSpeed, Name);
    // TODO Auto-generated constructor stub
}
}
4

2 に答える 2

0

これはちょっとあいまいです。コンテナ上のコンポーネントとどのようにやり取りしたいかによって決まります。

抽象クラスを使用して、クラスの基本概念を表し、個々のケースを実装できます

各コンポーネントを記述するモデルを構築し、コンポーネントがモデルの要件に基づいて UI を構築できるようにすることができます。

ここで達成しようとする重要なことは、責任の適切な分離を維持することです

于 2012-10-13T11:42:37.600 に答える
0

あなたがしたことは、あまり良くないことです。オブジェクトを処理する強力で強力な言語があります。オブジェクトを操作する方法に焦点を当てましょう。

同じコンストラクタと同じ構造を持つ 3 つの「異なる」クラスを単純に記述しました。

なぜ?

3 つの異なるインスタンスを作成するだけで、3 つの異なるパネルで作業できます。たとえば、このコードを変更します。

p2 = new Panel2(btn2, panel2, lblSpeed2, txtSpeed2, "Panel no. 2");
p3 = new Panel2(btn3, panel3, lblSpeed3, txtSpeed3, "Panel no. 3");

結果は同じですが、クラスは 1 つしかありません

私は昼食に行きます、それから私はあなたにもっとよく説明します。ちょっとまって

于 2012-10-13T11:37:30.443 に答える