Я пытаюсь создать графический интерфейс, который отображает некоторые данные для векторной маршрутизации, а что нет, но я застреваю, пытаясь получить информацию в таблице для обновления на физической таблице. Данные изменяются только внутри программы при нажатии кнопки (без взаимодействия с пользователем).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, но я не уверен, что добавить туда, и я думаю, что это моя проблема.
Может ли кто-нибудь указать мне в правильном направлении, чтобы получить это, где данные, отображаемые в таблице, будут фактически обновляться при изменении?
Спасибо!
* «Данные изменяются только в пределах программы при нажатии кнопки (без взаимодействия с пользователем).» * - Это противоречие, не так ли? Во всяком случае, где код для этой «кнопки»? – MadProgrammer
Я также был бы осторожен в выполнении return getValueAt (0, c) .getClass(); '... что произойдет, если значение столбца« null »? – MadProgrammer
@MadProgrammer Я знаю, я имел в виду не взаимодействие пользователя со столом. Я ничего не сделал с кнопкой, кроме отображения. У меня создается впечатление, что таблица может обновляться при изменении данных внутри нее. Я просто использую кнопку, чтобы в значительной степени сказать: «Хорошо, и выполните эту функцию, которая будет обновлять значения в таблице». Исправьте меня, если это не так, как это работает –