2016-06-15 8 views
0

JPanelは、JFrameのドロップダウンとテキストフィールドで構成されています。 JFrameにボタンがあり、ユーザーがそのボタンをクリックすると、アプリケーションは同じコンポーネント(ドロップダウンとテキストフィールド)を持つ新しいJPanelを追加します。だから、私はActionListenerを使ってボタンをクリックすると呼び出される関数を作成しました。ドロップダウンのようなJPanelコンポーネントから値を取得する方法、即座に作成されるテキストフィールド

GUI側からすべてうまく動作しますが、ユーザがJPanelを追加してこれらのドロップダウンとテキストフィールドに値を入力すると、[送信]ボタンがクリックされます。 Submitボタンをクリックすると、すべてのドロップダウンとテキストフィールドから値を取得できます。私はJPanelを作成するために同じ関数を使用しているので、これは挑戦です。最後のJPanel値を与えるので、値を取得するために名前を呼び出すことはできません。

どのように私はこれについて行く必要がありますか? JFrameのスクリーンショットとJPanelを作成する機能を追加しました。どんな助けもありがとうございます。ありがとう。

public static void AddPanel(final Container pane) { 

    panel1 = new JPanel(); 
    String text = "<html><b>Property" + nooftimes + " :</b></html>"; 
    JLabel label = new JLabel(text); 
    label.setPreferredSize(new Dimension(80, 30)); 
    panel1.add(label); 

    panel1.add(new JLabel("Please enter the property")); 
    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(); 
    model.addElement("value1"); 
    model.addElement("value2"); 
    model.addElement("value3"); 
    model.addElement("value4"); 
    model.addElement("value5"); 


    final JComboBox<String> comboBox1 = new JComboBox<String>(model); 
    AutoCompleteDecorator.decorate(comboBox1); 
    comboBox1.setPreferredSize(new Dimension(120, 22)); 
    panel1.add(comboBox1); 

    final JTextField txtfield1 = new JTextField(
      "Please enter your value here"); 
    txtfield1.setPreferredSize(new Dimension(200, 22)); 
    panel1.add(txtfield1); 

    txtfield1.addFocusListener(new FocusListener() { 
     public void focusGained(FocusEvent e) { 
      txtfield1.setText(""); 
     } 

     public void focusLost(FocusEvent e) { 
      // nothing 
     } 
    }); 
    container.add(panel1); 
    nooftimes++; 

    frame.revalidate(); 
    frame.validate(); 
    frame.repaint(); 
    } 

スクリーンショット: **frame_screenshot**}

答えて

3

JPanelを返品してList<JPanel>に保管することができます。送信ボタンをクリックすると、JPanelとそのComponentを繰り返し処理できます。

public class Application { 

    private static List<JPanel> panels = new ArrayList<>(); 
    private static Container someContainer = new Container(); 

    public static void main(String[] args) { 
     panels.add(addPanel(someContainer)); 
     panels.add(addPanel(someContainer)); 
     panels.add(addPanel(someContainer)); 

     submit(); 
    } 

    public static JPanel addPanel(final Container pane) { 
     JPanel panel1 = new JPanel(); 
     // shortened code 
     final JComboBox<String> comboBox1 = new JComboBox<String>(); 
     panel1.add(comboBox1); 

     final JTextField txtfield1 = new JTextField("Please enter your value here"); 
     txtfield1.setText(String.valueOf(Math.random())); 
     panel1.add(txtfield1); 
     return panel1; 
    } 

    private static void submit() { 
     for (JPanel panel : panels) { 
      Component[] components = panel.getComponents(); 
      for (Component comp : components) { 
       // Cast comp to JComboBox/JTextField to get the values 
       if (comp instanceof JTextField) { 
        JTextField textField = (JTextField) comp; 
        System.out.println(textField.getText()); 
       } 
      } 
     } 
    } 
} 
+0

お手数をおかけしていただきありがとうございます。あなたのソリューションは私のために働いた。私はあなたの答えを受け入れました。乾杯:) – Naseem

2

あなたは、単に(あなたのコンポーネントを追加し、ユーザからの入力を取得するために、特定の方法で(JPanelのを拡張する)クラスを持つことができ、すなわち、コンボボックスには、インデックスとテキストを選択しますテキストフィールドから)。 パネルを追加するたびに、静的メソッドを呼び出すのではなく、このクラスのインスタンスを作成し、参照をどこかに保持します(たとえば、arraylistに追加するなど)。

しかし、別のシナリオを考えてみることもできます。個人的には「オンザフライ」のコンポーネントを追加するのは好きではなく、必要な値の数を選択できるコンポーネント(たとえば別のJComboBoxなど)があります。 デフォルト値(たとえば4)を決めるので、最初はクラスの4つのパネルを作成し、それらを含む単純な配列を使用することができます。 ユーザーがパネルの数を変更した場合、フレームを破棄して新しいパネルを作成することができます。 もちろん、入力を挿入したままにしたい場合やフレームの構築に時間がかかる場合は、この解決法はうまくいかないでしょう。

Here iが作成GUIのスクリーンショットがある:ユーザが(二次元アレイに記憶されている)テキストフィールドを含む、選択の変更は私は以下のパネルを再現パーシャルの数を選択することができます。

+0

ありがとうございました。私はあなたの答えを参考にして投票しました。 – Naseem

関連する問題