gpt4 book ai didi

java - JTable 不会通过 PropertyChangeListener 更新 repaint()

转载 作者:行者123 更新时间:2023-11-29 07:45:38 25 4
gpt4 key购买 nike

我正在为 mysql 数据库编写一个用户客户端,它从数据库读取数据并将其显示在 JTable 中。到目前为止,PropertyChangeEvent 已使用正确的数据进行发送和接收。 rowData 和columnName 包含新的和更新的数据。如果创建一个空表以在程序开始时显示。尽管我有正确的数据并且我调用了 repaint(),但它并没有更新 JTable。我已经在网络和 stackoverflow 上搜索了好几个小时,但没有找到适合我问题的答案。

这是代码:

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 查看完整代码

最佳答案

您的代码正在更新 rowData 和 columnName 变量。这些变量只是存在于内存中,与 JTable 无关。创建 JTable 时,这两个变量中的数据将复制到 JTable 使用的 TableModel。

一种方法是直接更新TableModel。然后 TableModel 调用适当的 fireXXX 方法以确保表得到更新。您可以使用 DefaultTableModelsetDataVector(...) 方法重置现有 TableModel 中的数据。或者您可以使用 DefaultTableModelsetRowCount(0) 方法来清除模型。然后使用 addRow(...) 方法添加新行。

或者您的另一个选择是创建一个新的 TableModel 并将模型添加到表中。

this.rowData = StringTools.makeRowData((ResultSet)e.getNewValue());
this.columnName = StringTools.makeColumnName((ResultSet) e.getNewValue());
table.setModel( new DefaultTableModel(rowDate, columnName);

不需要 repaint() 或任何东西。

关于java - JTable 不会通过 PropertyChangeListener 更新 repaint(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com