2016-02-10 4 views
0

Как получить компоненты jpanel во время выполнения на Java. Я пытался получить компоненты для выполнения метода с ними в качестве параметров, но я понял, что по какой-то причине я не могу получить компоненты во время выполнения. Если вам нужна дополнительная информация, дайте мне знать, я просто не хочу делать лишним, чтобы поставить код, потому что я думаю, что могу просто получить ответ, не показывая его. Однако дайте мне знать, если это необходимо.Получение компонентов jpanel во время выполнения

public SetupFrame2(int flats, int floors) { 
    initComponents(); 
    //Construction of the JTABLE 
    jPanel1.setLayout(new BorderLayout()); 
    int rows = flats*floors; 
    JTable tbl = new JTable(); 
    DefaultTableModel dtm = new DefaultTableModel(); 

    String colomnName[] = {"Floor","Flat","Area","View","Vacant"}; 
    dtm.setColumnIdentifiers(colomnName); 

    for (int count = 1; count <= rows; count++) { 
    dtm.addRow(new Object[] {"", "", "","",""}); 
    } 
    tbl.setModel(dtm); 
    tbl.setPreferredScrollableViewportSize(new Dimension(100,250)); 
    tbl.setFillsViewportHeight(true); 
    tbl.getTableHeader().setReorderingAllowed(false); 

    jPanel1.add(new JScrollPane(tbl));  
} 

*

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {  
for(Component f : jPanel1.getComponents()) {   //It isnt getting the component on run time, 
      if(f instanceof JTable){  
       if(isJTableEmpty((JTable)f) == false){ //isJtable is a function form setupFrame2's superclass and its job so far is to return false, however its not working... 
       JOptionPane.showMessageDialog(null, "Empty", "Error", JOptionPane.ERROR_MESSAGE); 
       break; 
       } 
} 
} 
} 
+0

Пожалуйста, расскажите подробнее о своей проблеме и покажите свой уместный код, чтобы мы могли дать вам более конкретные рекомендации. –

+0

Я теперь добавил код ... – YOPI

+0

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

ответ

2

Я думаю, что ваш вопрос является примером XY problem где вы спрашиваете, как решить конкретную проблему кода, как получить компоненты в контейнере, когда лучшим решением может быть использование совершенно другого подхода. Что касается вашего прямого вопроса, это просто делается путем вызова getComponents() в контейнере, метода, который возвращает массив Component, хотя, если вы вставляете контейнеры, вам нужно будет развернуться в дерево контейнера/компонента, чтобы найти ваш компонент интерес. Для общей проблемы - как получить ссылку на interes, часто есть лучшие и более чистые решения, такие как создание ArrayList или HashMap для хранения интересующих вас ссылок, детали решения, хотя будут зависеть от деталей вашей проблемы и кода , о котором мы мало знаем.

Как всегда, убедитесь, что вы отделите код GUI от логического кода, и это часто лучше всего достигается с помощью M-V-C, как и структура программы.


Edit:

Я думал, что это держит JTable

Просто взгляните на свой собственный код; он не будет лежать:

jPanel1.add(new JScrollPane(tbl)); 

Что вы видите, добавляется непосредственно к jPanel1? Ответ: new JScrollPane(...) Ваш JTable есть, но это глубоко от jPanel1 два контейнера, так как он, занимаемые JViewport в ScrollPane, которая удерживается JScrollPane:

structure of a JScrollPane

Да, вы можете получить к нему, если вы рекурсивно пошли через jPanel1, но это хрупкий код.

... но мне интересно, почему вы думаете, что я делаю kluges методы

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

Вместо этого почему бы просто, но JTable (или, может быть, лучше, его модель), не превратить какую-нибудь переменную или какую-нибудь коллекцию для простой и стабильной ссылки?

+1

++ начиная с первого предложения .. –