2015-04-13 3 views
1

Я пытаюсь создать графический интерфейс, который отображает некоторые данные для векторной маршрутизации, а что нет, но я застреваю, пытаясь получить информацию в таблице для обновления на физической таблице. Данные изменяются только внутри программы при нажатии кнопки (без взаимодействия с пользователем).JTable не обновляется

Вот мой класс драйвера:

public class DistanceVectorRouting { 

    public static void main(String[] args) { 
     DistanceVectorRoutingUI gui = new DistanceVectorRoutingUI(); 
     gui.turnOnGUI(); 

     System.out.println(gui.routerTable1.getValueAt(0, 1)); 

     gui.routerTable1.setValueAt("foo", 0, 1); 
     System.out.println(gui.routerTable1.getValueAt(0, 1)); 
     //fireTableDataChanged(); 
    } 

} 

Вот где я инициализировать и добавить слушателя:

public class DistanceVectorRoutingUI extends JFrame { 

    /** 
    * Creates new form DistanceVectorRoutingUI 
    */ 
    public DistanceVectorRoutingUI() { 
     initComponents(); 
    } 

private void initComponents() { 

routerTable1 = new javax.swing.JTable(); 
     routerTable1.setModel(new MyTableModel()); 
     routerTable1.getModel().addTableModelListener(new TableModelListener() { 

      public void tableChanged(TableModelEvent e) { 
       System.out.println(e); 
      } 
     }); 
} 

public static void turnOnGUI() { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(DistanceVectorRoutingUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(DistanceVectorRoutingUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(DistanceVectorRoutingUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(DistanceVectorRoutingUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new DistanceVectorRoutingUI().setVisible(true); 
      } 
     }); 
    } 

Вот MyTableModel класс:

public class MyTableModel extends AbstractTableModel implements TableModelListener { 

    private String[] columnNames = {"Destination", "Distance"}; 
    private Object[][] data = {{"1", "1"}, 
           {"2", "1"}, 
           {"3", "1"}, 
           {"4", "1"}, 
           {"5", "1"}, 
           {"6", "1"}}; 
@Override 
    public int getColumnCount() { 
     return columnNames.length; 
    } 

    @Override 
    public int getRowCount() { 
     return data.length; 
    } 

    @Override 
    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    @Override 
    public Object getValueAt(int row, int col) { 
     return data[row][col]; 
    } 


    @Override 
    public Class getColumnClass(int c) { 
     return getValueAt(0, c).getClass(); 
    } 


    @Override 
    public boolean isCellEditable(int row, int col) { 
     if (col < 2) { 
      return false; 
     } else { 
      return true; 
     } 
    } 


    @Override 
    public void setValueAt(Object value, int row, int col) { 
     this.data[row][col] = value; 
     System.out.println(this.data[row][col]); 
     fireTableDataChanged(); 
    } 
} 

Всякий раз, когда я призываю setValueAt(), я делаю это в основном методе, и все работает (ячейки обновляются и вызывается tableChanged).

Я знаю, что у меня не должно быть только заявление печати в методе tableChanged, но я не уверен, что добавить туда, и я думаю, что это моя проблема.

Может ли кто-нибудь указать мне в правильном направлении, чтобы получить это, где данные, отображаемые в таблице, будут фактически обновляться при изменении?

Спасибо!

+0

* «Данные изменяются только в пределах программы при нажатии кнопки (без взаимодействия с пользователем).» * - Это противоречие, не так ли? Во всяком случае, где код для этой «кнопки»? – MadProgrammer

+0

Я также был бы осторожен в выполнении return getValueAt (0, c) .getClass(); '... что произойдет, если значение столбца« null »? – MadProgrammer

+0

@MadProgrammer Я знаю, я имел в виду не взаимодействие пользователя со столом. Я ничего не сделал с кнопкой, кроме отображения. У меня создается впечатление, что таблица может обновляться при изменении данных внутри нее. Я просто использую кнопку, чтобы в значительной степени сказать: «Хорошо, и выполните эту функцию, которая будет обновлять значения в таблице». Исправьте меня, если это не так, как это работает –

ответ

4

Посмотрите, что происходит. turnOnGUI() создает кадр (и устанавливает видимый), который не имеет ссылки.

new DistanceVectorRoutingUI().setVisible(true); 

Тогда в другом классе вы создаете другой кадр (gui). Но не устанавливайте его видимым.

DistanceVectorRoutingUI gui = new DistanceVectorRoutingUI(); 
gui.turnOnGUI(); 

У вас есть два экземпляра кадра. gui никогда не отображается.

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