【发布时间】:2022-07-27 22:37:43
【问题描述】:
我创建了一个 Jtable,其中包含有关 f1 驱动程序的一些信息。以下代码适用于 Jtable
import java.awt.LayoutManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.event.*;
public class Test1 extends JFrame implements ActionListener {
JButton button;
Test1() {
//setBounds(100, 100, 500, 400);
JFrame frame = new JFrame();
button = new JButton();
//button.setBounds(50, 50, 20, 10);s
button.setText("Random Race");
button.addActionListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable table = new JTable(new Model1Data());
frame.setBounds(100, 100, 500, 400);
JPanel panel = new JPanel();
frame.add(panel);
panel.add(new JScrollPane(table));
panel.add(button);
//add(new J
frame.setVisible(true);
//this.add(button);
pack();
}
@Override
public void actionPerformed(ActionEvent e) {
Formula1ChampionsManager d= new Formula1ChampionsManager();
d.button();
}
}
这是 Model1Data 的代码。这是表格更新其单元格的代码。
import javax.swing.table.AbstractTableModel;
public class Model1Data extends AbstractTableModel implements ChampionsManager {
String colNames[] = { "Name", "Team", "No of first Places", "Total Points" };
Class<?> colClasses[] = { String.class, String.class, Integer.class, Integer.class };
public int getRowCount() {
return myDrivers.size();
}
public int getColumnCount() {
return colNames.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
return myDrivers.get(rowIndex).getName();
}
if (columnIndex == 1) {
return myDrivers.get(rowIndex).getTeam();
}
if (columnIndex == 2) {
return myDrivers.get(rowIndex).getfirstPlace();
}
if (columnIndex == 3) {
return myDrivers.get(rowIndex).totalPoints();
}
return null;
}
public String getColumnName(int columnIndex) {
return colNames[columnIndex];
}
public Class<?> getColumnClass(int columnIndex) {
return colClasses[columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
myDrivers.get(rowIndex).setName((String) aValue);
}
if (columnIndex == 1) {
myDrivers.get(rowIndex).setTeam((String) aValue);
}
if (columnIndex == 2) {
myDrivers.get(rowIndex).setfirstPlace((Integer) aValue);
}
if (columnIndex == 3) {
myDrivers.get(rowIndex).settotalPoints((Integer) aValue);
}
//fireTableCellUpdated(rowIndex, columnIndex);
}
}
这就是表格 gui 的样子 Table GUI。当我单击该按钮时,No of first places 和 Total Points 的值会随机更改。但该表没有得到更新的值。如果我拉到框架的一侧,它就会更新。单击按钮时如何更新它?
【问题讨论】:
-
如果您正在更新模型,它应该会自动更新。如果不是,您可能需要关闭 model.fireTableDataChanged()
-
如果 Ryan 的建议不起作用,请尝试重新验证或重新绘制表格组件。您可以通过调用适当的方法以编程方式执行此操作。
-
@Ryan 我应该把它添加到哪里
-
@John 在您更新单元格值后立即在您的按钮功能中。或者,如果您知道行和列,您可以致电
model.fireTableCellUpdated()。哦,你应该在SwingWorker -
@Ryan 实际上,对模型对象的更改和对 fireTableCellUpdated 的调用应该不在 SwingWorker 或除事件调度线程之外的任何线程中完成。显然应该是长时间运行的任务,但是模型的最终更改应该在读取模型的线程中,即事件调度线程。
标签: java