gpt4 book ai didi

java - 无法使用新数据刷新我的 JTable

转载 作者:行者123 更新时间:2023-12-01 04:37:43 25 4
gpt4 key购买 nike

我创建了一个JTable当框架最初创建时,但创建一个空的 AbstractTableModel我扩展了它。然后用户必须从JComboBox中选择一些内容。用户可以预览处理该指定选择的消息。

单击预览按钮时,我创建一个新的 AbstractTableModel使用新数据并将该模型设置为新创建的 JTable 对象。完成后,我调用 AbstractTableModel.fireTableDataChanged , JTable.repaint() , JTable.validate() JFrame.repaint() , JFrame.validate() .

尽管打了这么多电话,我仍然无法得到 JTable使用新数据刷新。

我的JFrameJTable :

public class StudentMessageViewer extends JFrame implements ActionListener {
final String CMD_DELETE = "CMD_DELETE";
final String CMD_DUMP = "CMD_DUMP";
final String CMD_MOVE = "CMD_MOVE";
final String CMD_PREVIEW = "CMD_PREVIEW";
private Students students;
private JComboBox<String> Names;
private TableModel Model;

public Selector(Students students) {
super("Main");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(700, 800));
setContentPane(getMainPanel());
setLocationRelativeTo(null);
setVisible(true);
}

private JPanel getMainPanel() {
JPanel main = new JPanel();
main.add(getSelectorPanel());
main.add(getTablePanel());
main.add(getButtonPanel());

return main;
}

private JPanel getSelectorPanel() {
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.PAGE_AXIS));

FlowLayout flowLayout = new FlowLayout(FlowLayout.RIGHT);
main.setMaximumSize(new Dimension(450, 180));
Names = new JComboBox<String>(students.getNames());

JPanel NamesPanel = new JPanel();
NamesPanel.add(new JLabel("Name: "));
NamesPanel.add(Names);

main.add(NamesPanel);

return main;
}

private JPanel getTablePanel() {
JPanel main = new JPanel();

this.Model = new Model(new Object[0][4]);
this.MessagesTable = new JTable(this.Model);

TableColumn column = this.MessagesTable.getColumnModel().getColumn(0);
column.setPreferredWidth(20);
this.MessagesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.MessagesTable.setSelectionBackground(getBackground());
this.MessagesTable.setSelectionForeground(getForeground());

main.add(new JScrollPane(this.MessagesTable));

return main;
}

private JPanel getButtonPanel() {
JPanel main = new JPanel(new FlowLayout(FlowLayout.RIGHT));

JButton btnDelete = new JButton("Delete");
JButton btnDump = new JButton("Dump");
JButton btnMove = new JButton("Move");
JButton btnPreview = new JButton("Preview");

btnDelete.setActionCommand(CMD_DELETE);
btnDump.setActionCommand(CMD_DUMP);
btnMove.setActionCommand(CMD_MOVE);
btnPreview.setActionCommand(CMD_PREVIEW);

btnDelete.addActionListener(this);
btnDump.addActionListener(this);
btnMove.addActionListener(this);
btnPreview.addActionListener(this);

main.add(btnDelete);
main.add(btnDump);
main.add(btnMove);
main.add(btnPreview);

this.getRootPane().setDefaultButton(btnPreview);

return main;
}

private void setTableData() {
Object data[][] = students.Select(Names.getSelectedItem().toString());

this.Model = new Model(data);
this.MessagesTable = new JTable(this.Model);

TableColumn column = this.MessagesTable.getColumnModel().getColumn(0);
column.setPreferredWidth(20);
this.MessagesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.MessagesTable.setSelectionBackground(getBackground());
this.MessagesTable.setSelectionForeground(getForeground());

((AbstractTableModel) this.MessagesTable.getModel()).fireTableDataChanged();
this.MessagesTable.repaint();
this.repaint();
this.validate();
}

@Override
public void actionPerformed(ActionEvent event) {
String actionCmd = event.getActionCommand();

if(actionCmd.equals(CMD_DELETE))
System.out.println("DELETE");
else if(actionCmd.equals(CMD_DUMP))
System.out.println("DUMP");
else if(actionCmd.equals(CMD_MOVE))
System.out.println("MOVE");
else if(actionCmd.equals(CMD_PREVIEW))
setTableData();
}
}

我的TableModel我扩展的类AbstractTableModel :

public class Model extends AbstractTableModel {
Object data[][];
String columnNames[] = { "", "Message ID", "Group ID", "DateSent", "Message"};

public Model(Object[][] data) {
this.data = new Object[data.length][columnNames.length];
for (int i = 0; i < data.length; i++) {
this.data[i][0] = Boolean.TRUE;
for (int j = 0; j < columnNames.length - 1; j++)
this.data[i][j + 1] = data[i][j];
}
}

public int getColumnCount() {
return (columnNames == null ? 0 : columnNames.length);
}

public String getColumnName(int column) {
return (columnNames == null ? "" : columnNames[column]);
}

public int getRowCount() {
return (data == null ? 0 : data.length);
}

public Object getValueAt(int row, int column) {
return (columnNames == null ? new Object() : data[row][column]);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getColumnClass(int column) {
return (getValueAt(0, column).getClass());
}

public void setValueAt(Object value, int row, int column) {
data[row][column] = value;
}

public boolean isCellEditable(int row, int column) {
return (column == 0);
}
}

最佳答案

所以我想通了。在 setTableData()方法StudentMessageViewer类,我正在创建一个全新的TableModel对象和一个全新的JTable对象,但将这两个新对象分配给原始变量。所以我可能不得不做 repaint()validate()但我不明白。

但为了解决这个问题,我所做的是创建一个全新的 TableModel反对并使用 JTable.setModel()替换旧的TableModel .

这是修改后的方法:

private void setTableData() {        
Object data[][] = students.Select(Names.getSelectedItem().toString());

this.Model = new Model(data);

TableColumn column = this.MessagesTable.getColumnModel().getColumn(0);
column.setPreferredWidth(20);
this.MessagesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.MessagesTable.setSelectionBackground(getBackground());
this.MessagesTable.setSelectionForeground(getForeground());

this.MessagesTable.setModel(this.MyModel);
}

现在我可以根据需要多次更新表格。

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

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