gpt4 book ai didi

java - 使用 setValueAt 更改数据后无法更新 JTable 的值

转载 作者:行者123 更新时间:2023-12-01 21:54:49 24 4
gpt4 key购买 nike

我已经完成了 JTable 来进行简单的访问安排。它包含自定义 AbstractTableModel,显示如下所示的三列。

问题是可以初始化表并获得所需的外观 - 但数据更改后表的外观没有变化。每次单击按钮都会从数据库中获取数据,并根据给定的预订时间和日期设置 TYPE 和 STATE 列中的字段。

此外,我可以在表末尾插入新行,但无法进行可见的现有值更新。我已经读过一些类似的主题,但对我的情况没有任何帮助。预先感谢您的每一个建议。

enter image description here

[更新]说明问题的工作代码:

import java.awt.EventQueue;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ModelTest {

private JFrame frame;
private JTable tablePendingVisits;
private PendingVisitModel pendingVisitModel;
private JScrollPane scrollPanePendingVisits;

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ModelTest window = new ModelTest();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public ModelTest() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 407);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

JButton btnChangeValue = new JButton("Change value at 9:00");
btnChangeValue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
refreshTableModel();
}
});
btnChangeValue.setBounds(63, 308, 305, 23);
frame.getContentPane().add(btnChangeValue);

tablePendingVisits = new JTable();
scrollPanePendingVisits = new JScrollPane();
pendingVisitModel = new PendingVisitModel();

tablePendingVisits.setModel(pendingVisitModel);
scrollPanePendingVisits.setBounds(63, 36, 305, 246);
scrollPanePendingVisits.setViewportView(tablePendingVisits);

frame.getContentPane().add(scrollPanePendingVisits);
}

public void refreshTableModel(){
String[] sampleString = {"9:00", "Bobby", "Tables"};

// search for row with 9:00 and replace values in given columns
for (int i = 0; i < pendingVisitModel.getRowCount(); i++) {

if( sampleString[0].equals(pendingVisitModel.getValueAt(i, 0)) ) { // Change row values when both hours are equal
pendingVisitModel.setValueAt(sampleString[1], i, 1); // Change at type column
pendingVisitModel.setValueAt(sampleString[2], i, 2); // Change at status column
}
}
}
}

// Custom TableModel
class PendingVisitModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

private String[] columnNames = {"HOUR", "TYPE", "STATE"};
private Vector<String[]> data = new Vector<String[]>();

public PendingVisitModel() {

for(int i = 8; i<15; i++) {
data.add(new String[]{i+":00", "-", "Free"} );
data.add(new String[]{i+":15", "-", "Free"} );
data.add(new String[]{i+":30", "-", "Free"} );
data.add(new String[]{i+":45", "-", "Free"} );
}
}

public int getColumnCount() {
return columnNames.length;
}

public int getRowCount() {
return data.size();
}

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

public String getValueAt(int row, int col) {
String[] temp = data.get(row);
if(temp.length > 0 && col < 3)
return temp[col];
else
return null;
}

public void setValueAt(String[] value, int row, int col) {
String[] temp = data.get(row);
temp[col] = value[col];

data.set(row, temp);
fireTableRowsUpdated(row, row);
}

public void insertRow(String[] value) {
data.add(value);
fireTableRowsInserted(data.size(), data.size());
}

public void clearRows(){
data.clear();
fireTableDataChanged();
}

public void removeAllEntry(){
data.clear();
fireTableDataChanged();
}

public boolean isCellEditable(int row, int col) {
return false;
}

@Override
public Class<String> getColumnClass(int colNum) {
return String.class;
}
}

最佳答案

PendingVisitModel pendingVisitModel = new PendingVisitModel();

在我看来就像 pendingVisitModel被定义为局部变量。这是您添加到表中的模型。

refreshTableModel()方法引用 pendingVisitModel变量,但我猜这是一个表不使用的实例变量。

删除 pendingVisitModel 的本地实例.

fireTableDataChanged();

也不要继续使用firTableDataChanged在所有 TableModel 方法中。 API 提供了更适合不同事件的其他方法。

编辑:

public void setValueAt(String[] value, int row, int col) {

您没有重写 setValueAt(...) 方法。 value 参数是一个对象而不是字符串数组。

每当您重写类的方法时,都应该在该方法之前使用 @Override 注释。这样,如果您错误地重写方法,编译器会给您一个错误(节省数小时的挫败感...)。

@Override
public void setValueAt(Object value, int row, int col) {

关于java - 使用 setValueAt 更改数据后无法更新 JTable 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34522133/

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