2013-11-22 4 views
-1

Я использую плагин Window Builder для Eclipse для создания приложения Java Swing Desktop Front End. Проблема в том, что при прослушивании событий, когда я хочу получить значение компонентов, я индивидуально получаю компонент по индексу. См фрагмент кода Каков лучший способ получить компоненты swing

public class SomeListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent event) { 


     //button from which action is triggered 
     JButton startTestButton = (JButton) event.getSource(); 

     //components 
     Component[] components = startTestButton.getParent().getComponents();   

     //Get individual components 
     JCheckBox endUserLabel = (JCheckBox) components[0]; 
    } 
} 

Проблема, когда-либо новый элемент добавляется в контейнер, позволяет сказать JTextBox, индекс всех элементов изменяется. Есть ли лучший способ достичь этого?

+0

Вы имеете в виду вы хотите добавить компонент на какое-то событие действия? – rachana

+0

@rachana Нет, я имел в виду, что если есть много компонентов, то место реструктуризации компонентов или их добавление в контейнер приведет к исключению класса cast Exception, т.е. компоненты JCheckBox endUserLabel = (JCheckBox) [4]; 'через исключение b/c метка может быть на другом индексе. –

+0

Затем проверьте, является ли это JCheckBox.class перед выполнением кода. –

ответ

0

Да, не зависит от индекса в getComponents(). Вместо этого настройте свой ActionListener с нужными нумерациями или ссылкой на объект контроллера, который может внести необходимые изменения в графический интерфейс. Сделайте это все до вызова метода actionPerformed().

В качестве побочного примечания, если вы собираетесь продолжать работу над этим проектом, выкиньте создатель GUI и код вручную. Это сэкономит вам силы в долгосрочной перспективе и поможет вам быстрее научиться Swing.

+0

Я фактически заполняю свой объект класса, получая значение этого компонента в 'ActionListener'. Можете ли вы показать на примере, что вы пытаетесь сказать? Вы имели в виду, что я использую bean binding framework, чтобы мой объект модели уже был заполнен при вызове 'ActionListener'? –

+0

Я не говорю о структуре привязки bean. Я говорю о простой ссылке на ваши компоненты, чтобы иметь возможность получать доступ к своим значениям напрямую, а не полагаться на список родительских компонентов. – jzd

0

Если вы хотите получить доступ к определенным виджетам в прослушивателе, вам необходимо либо отследить их, либо предоставить способ их устранения.

Tracking решения:

  • создания атрибутов (полей экземпляра) для виджетов
  • отслеживать виджеты карте

Решение с разрешения:

  • Установить ' name "в ваших виджетах и ​​создать метод с разрешением их по имени в дереве компонентов.

Даже лучшее решение:

  • использовать привязку данных, поэтому изменения на виджетах получить отраженные от модели представления и чтения значений/записи всегда над моделью, а не виджеты.

Пример с отслеживанием:

final JTextField textField = new JTextField(); 
textField.setName("userinput"); 

JButton ok = new JButton("OK"); 
ok.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed (ActionEvent e) { 
     System.out.println("Text: " + textField.getText()); 
    } 
}); 
+0

Я выберу еще лучшее решение :), вы рекомендуете любое легкое решение для связывания бобов, которое заполняет данные DataModel? –

+0

Посмотрите на JGoodies Binding: http://www.jgoodies.com/freeware/libraries/binding/ –

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