2016-02-06 2 views
0

Чисто теоретически, при добавлении новых компонентов, как этогоДинамически добавить компонент поворота в gui по щелчку?

JButton buttonAdd= new JButton("Add More"); 
     buttonAdd.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
        panel.add(new JComboBox<String>(data); 
        panel.add(new JTextField(); 
       } 
     }); 

Есть ли способ getSelectedIndex() или GetText(), когда и не объявят его в обычном порядке?

+0

* "Чисто теоретически .." * Не очень заинтересованы в теоретических вопросов. Практически, зачем добавлять такие компоненты? Каков прецедент, оправдывающий его? В стороне это выглядит так, что GUI лучше будет нуждаться в 1) Объект, который содержит «String» для текстового поля и «int» для индекса данных, выбранных в комбо. 2) Используйте JList с настраиваемым визуализатором для отображения объектов, сформированных в (1). 3) Когда пользователь выбирает элемент списка, покажите детали в одном текстовом поле и поле со списком вне списка. .. –

+0

.. Но все эти советы зависят от предположений о том, чего вы пытаетесь достичь. Что-нибудь лучше, чем предположения, объясните, как этот GUI должен работать для пользователя. –

ответ

0

Есть несколько способов добраться до dynamicaly добавлены компоненты качели дерево:

1-й подход:

panel.getComponent(n); 

возвращает n'th компонент в панели (Container). (П есть порядок, что компонент, добавленный к родителю (родитель panel здесь)) (вы должны знать, индекс компонента) таким образом, вы можете использовать ((JComboBox)panel.getComponent(3)).getSelectedIndex()

2-й подход

непосредственно добавить слушателей, когда динамическое добавление ваших компонентов;

JButton b1 = new JButton("add"); 
b1.addActionListener(e -> { 

    JComboBox<String> color = new JComboBox<String>(); 
    color.addActionListener(x -> { myFormBean.setColor(color.getSelectedItem();) }); 
    panel.add(color); 

    JTextField name = new JTextField(); 
    name.getDocument().addDocumentListener(new DocumentListener() { 
     @Override 
     public void removeUpdate(DocumentEvent e) { 
      myFormBean.setName(name.getText()); 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      myFormBean.setName(name.getText()); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      myFormBean.setName(name.getText()); 
     } 
    }); 
    panel.add(name); 

    panel.revalidate(); 
    panel.repaint(); 

}); 

Таким образом, вам не нужно получать динамически добавленные компоненты.

третий подход может использовать рамки для связывания данных,

4RD подход ...

0

Да, вы можете добавить компоненты Swing в контейнер таким образом. Однако вам нужно позвонить revalidate на панели, иначе они могут не отображаться мгновенно.

Если вам нужно получить доступ к этим компонентам после их создания, присвойте значение, возвращаемое конструктором, в поле вашего объекта, объявленное внутри вашего класса. Вы не можете назначить переменную в вызывающем методе, поскольку конструкторы вызываются из внутреннего класса.

+0

какой-нибудь пример, как это сделать? Или источник, где я могу читать больше? – Michael

+1

@Michael [Создание графического интерфейса с Swing] (http://docs.oracle.com/javase/tutorial/uiswing/), [Выравнивание компонентов в контейнере] (https://docs.oracle.com/javase/ tutorial/uiswing/layout /), ['Container # add'] (https://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#add (java.awt.Component)), ['Компонент # revalidate'] (https://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#revalidate()) – MadProgrammer

Смежные вопросы