JTable 不会通过 PropertyChangeListener 在 repaint() 上更新
JTable doesn`t update on repaint() via PropertyChangeListener
我m programming a user client for a mysql database which reads data from the database and displays it in a JTable. I
已经做到了,PropertyChangeEvent 是用正确的数据发送和接收的。 rowData 和 columnName 有新的和更新的数据。如果创建一个空 table 以在程序开始时显示。虽然我有正确的数据并且我调用了 repaint(),但它确实t update the JTable.
I
已经在网络和 Whosebug 上搜索了好几个小时,但没有找到适合我的问题的答案。
代码如下:
public class SuchenPanel extends JPanel implements PropertyChangeListener{
protected SuchenComboBoxControl comboControl = new SuchenComboBoxControl();
protected String[][] rowData = StringTools.makeRowData(comboControl.getCurrentRs());
protected String[] columnName = StringTools.makeColumnName(comboControl.getCurrentRs());
protected JTable tableView = new JTable(rowData,columnName);
protected JScrollPane scroll = new JScrollPane(tableView);
public SuchenPanel(){
comboControl.addPropertyChangeListener(this);
setLayout(new BorderLayout());
JPanel north = new JPanel();
north.setLayout(new GridLayout(0,3,6,3));
JComboBox<Object> tableBox= new JComboBox<Object>(TablesColoumns.TABLES);
tableBox.setActionCommand(SuchenCommand.TABLE);
tableBox.addActionListener(comboControl);
north.add(new JLabel("In welcher Tabelle wollen Sie suchen?"));
north.add(tableBox);
add(north,BorderLayout.NORTH);
add(scroll,BorderLayout.CENTER);
}
@Override
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if(propertyName.equals(PropertyChangeCommands.tableUPDATE)){
this.rowData = StringTools.makeRowData((ResultSet)e.getNewValue());
this.columnName = StringTools.makeColumnName((ResultSet) e.getNewValue());
repaint();
}
}
和 firePropertyChangeEvent:
public class SuchenComboBoxControl implements ActionListener{
protected ResultSet currentRs=null;
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public SuchenComboBoxControl(){
}
@Override
public void actionPerformed(ActionEvent e) {
JComboBox<?> cb = (JComboBox<?>)e.getSource();
String command = e.getActionCommand();
switch(command){
case SuchenCommand.TABLE:
String tablename = (String)cb.getSelectedItem();
ResultSet execRs=MysqlConnection.getResultFromStatement("select * from "+StringTools.concatForExecute(tablename));
this.pcs.firePropertyChange(PropertyChangeCommands.tableUPDATE, currentRs, execRs);
this.currentRs=execRs;
}
}
public void addPropertyChangeListener (PropertyChangeListener listener){
this.pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
this.pcs.removePropertyChangeListener(listener);
}
如果需要,您可以在 full Code
查看完整代码
你在 ((DefaultTableModel)[JTable].getModel())
上试过 fireTableDataChanged()
了吗?
您的代码正在更新 rowData 和 columnName 变量。这些变量只是位于内存中,与 JTable 无关。当您创建 JTable 时,来自这两个变量的数据将被复制到 JTable 使用的 TableModel。
一种方法是直接更新 TableModel
。然后 TableModel 调用适当的 fireXXX 方法以确保 table 得到更新。您可以使用 DefaultTableModel
的 setDataVector(...)
方法来重置现有 TableModel 中的数据。或者你可以使用DefaultTableModel
的setRowCount(0)
方法清除模型。然后使用 addRow(...)
方法添加新行。
或者您的其他选择是创建一个新的 TableModel 并将模型添加到 table。
this.rowData = StringTools.makeRowData((ResultSet)e.getNewValue());
this.columnName = StringTools.makeColumnName((ResultSet) e.getNewValue());
table.setModel( new DefaultTableModel(rowDate, columnName);
不需要 repaint() 或任何东西。
我m programming a user client for a mysql database which reads data from the database and displays it in a JTable. I
已经做到了,PropertyChangeEvent 是用正确的数据发送和接收的。 rowData 和 columnName 有新的和更新的数据。如果创建一个空 table 以在程序开始时显示。虽然我有正确的数据并且我调用了 repaint(),但它确实t update the JTable.
I
已经在网络和 Whosebug 上搜索了好几个小时,但没有找到适合我的问题的答案。
代码如下:
public class SuchenPanel extends JPanel implements PropertyChangeListener{
protected SuchenComboBoxControl comboControl = new SuchenComboBoxControl();
protected String[][] rowData = StringTools.makeRowData(comboControl.getCurrentRs());
protected String[] columnName = StringTools.makeColumnName(comboControl.getCurrentRs());
protected JTable tableView = new JTable(rowData,columnName);
protected JScrollPane scroll = new JScrollPane(tableView);
public SuchenPanel(){
comboControl.addPropertyChangeListener(this);
setLayout(new BorderLayout());
JPanel north = new JPanel();
north.setLayout(new GridLayout(0,3,6,3));
JComboBox<Object> tableBox= new JComboBox<Object>(TablesColoumns.TABLES);
tableBox.setActionCommand(SuchenCommand.TABLE);
tableBox.addActionListener(comboControl);
north.add(new JLabel("In welcher Tabelle wollen Sie suchen?"));
north.add(tableBox);
add(north,BorderLayout.NORTH);
add(scroll,BorderLayout.CENTER);
}
@Override
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if(propertyName.equals(PropertyChangeCommands.tableUPDATE)){
this.rowData = StringTools.makeRowData((ResultSet)e.getNewValue());
this.columnName = StringTools.makeColumnName((ResultSet) e.getNewValue());
repaint();
}
}
和 firePropertyChangeEvent:
public class SuchenComboBoxControl implements ActionListener{
protected ResultSet currentRs=null;
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public SuchenComboBoxControl(){
}
@Override
public void actionPerformed(ActionEvent e) {
JComboBox<?> cb = (JComboBox<?>)e.getSource();
String command = e.getActionCommand();
switch(command){
case SuchenCommand.TABLE:
String tablename = (String)cb.getSelectedItem();
ResultSet execRs=MysqlConnection.getResultFromStatement("select * from "+StringTools.concatForExecute(tablename));
this.pcs.firePropertyChange(PropertyChangeCommands.tableUPDATE, currentRs, execRs);
this.currentRs=execRs;
}
}
public void addPropertyChangeListener (PropertyChangeListener listener){
this.pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
this.pcs.removePropertyChangeListener(listener);
}
如果需要,您可以在 full Code
查看完整代码你在 ((DefaultTableModel)[JTable].getModel())
上试过 fireTableDataChanged()
了吗?
您的代码正在更新 rowData 和 columnName 变量。这些变量只是位于内存中,与 JTable 无关。当您创建 JTable 时,来自这两个变量的数据将被复制到 JTable 使用的 TableModel。
一种方法是直接更新 TableModel
。然后 TableModel 调用适当的 fireXXX 方法以确保 table 得到更新。您可以使用 DefaultTableModel
的 setDataVector(...)
方法来重置现有 TableModel 中的数据。或者你可以使用DefaultTableModel
的setRowCount(0)
方法清除模型。然后使用 addRow(...)
方法添加新行。
或者您的其他选择是创建一个新的 TableModel 并将模型添加到 table。
this.rowData = StringTools.makeRowData((ResultSet)e.getNewValue());
this.columnName = StringTools.makeColumnName((ResultSet) e.getNewValue());
table.setModel( new DefaultTableModel(rowDate, columnName);
不需要 repaint() 或任何东西。