gpt4 book ai didi

java - JTable (BeanTableModel) 不更新/刷新 - Java Swing

转载 作者:行者123 更新时间:2023-12-01 08:08:39 28 4
gpt4 key购买 nike

我有 2 个面板。一种是用户插入数据,另一种是 JTable结果将显示在其中。

我的问题是当用户按下“确定”时(在我的情况下适用)JButton数据已计算,但未显示在 JTable 上, JTable 中没有任何变化.

对于我的JTable我正在使用Bean Table Model来自 Tips4Java (http://tips4java.wordpress.com/2008/11/27/bean-table-model/)。

一件奇怪的事情是,如果我在程序启动时向表发送数据(让我们将此数据称为“A”),它就会显示在表上,并且如果稍后我尝试更新表,表不会更新。但是,当我在启动时不向表发送数据但尝试使用数据“A”更新/发送表时,它不会更新。

所以我的问题是,为什么不是 JTable显示我发送到的任何数据?

这是我的代码:

JButton 监听器开始处理并将数据发送到表:

crashForm.setFormListener(new FormListener() {
@Override
public void formEvent(OptionsFormEvent oe) {
String readTable = oe.getReadFromTable();
int access = oe.getAccess();
int transition = oe.getTransition();
boolean smooth = oe.isTrainCrash();
ArrayList<String> allTrains = new ArrayList<>();
List crashedTrainList = new ArrayList<>();

try {
allTrains = controller.getUniqueTrains(controller.connectServer(), readTable, "trainid");
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "An error occured while getting trains data\n"
+ "Error description: " + ex.getMessage(), "Error",
JOptionPane.ERROR_MESSAGE);
}

try {
for (int i = 0; i < allTrains.size(); i++)
{
ArrayList<Train> trainDataList = new ArrayList<>();
ArrayList<Train> crashedProccessedData = new ArrayList<>();

String query = "the sql query...";

trainDataList = controller.getTrainData(controller.connectServer(), readTable, query);

crashedProccessedData = controller.detectCrash(access, transition, trainDataList);
crashedTrainList.addAll(crashedProccessedData);

}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "An error occured while detecting a crash.\n"
+ "Error description: " + ex.getMessage(), "Error",
JOptionPane.ERROR_MESSAGE);
}

System.out.println("Total crashes detected:" + crashedTrainList.size());
tablePanel.createTable(Train.class, crashedTrainList, true, false, tableLabels);
tablePanel.fireTableDataChanged();
}
});
}

这是我的 tablePanel 类:

    public TablePanel() {
}
public void createTable(Class c, List data, boolean toolBarUp,
boolean toolBarBottom, ArrayList<String> labelsCheckBox) {

beanTableModel = new BeanTableModel(c, data);
columnModel = new XTableColumnModel();
table = new JTable(beanTableModel);
table.setColumnModel(columnModel);
table.createDefaultColumnsFromModel();

if(toolBarUp == true)
{
final JToolBar toolBarTop = new JToolBar();

// Create the Show ALL
JButton reset = new JButton("Reset");

reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

for(Component c : toolBarTop.getComponents()){
if(c instanceof JCheckBox){
JCheckBox checkBox = (JCheckBox) c;
checkBox.setSelected(false);
columnModel.setAllColumnsVisible();
}
}
int numberOfColumn = columnModel.getColumnCount();

for(int aux = 0; aux < numberOfColumn; aux++)
{
int num = columnModel.getColumnCount();
TableColumn column = columnModel.getColumnByModelIndex(aux);
columnModel.setColumnVisible(column, true);
}
}
});

toolBarTop.add(reset);

// Create a JCheckBox for each column
for(int i = 0; i < labelsCheckBox.size(); i++)
{
final int index = i;
toolBarTop.add(new JCheckBox(new AbstractAction(labelsCheckBox.get(i)) {
@Override
public void actionPerformed(ActionEvent e) {
TableColumn column = columnModel.getColumnByModelIndex(index);
boolean visible = columnModel.isColumnVisible(column);
columnModel.setColumnVisible(column, !visible);
}
}));
}



setLayout(new BorderLayout());
add(toolBarTop, BorderLayout.NORTH);
add(new JScrollPane(table), BorderLayout.CENTER);
// add(toolBarDown, BorderLayout.SOUTH);
}


final JToolBar toolBarDown = new JToolBar();

toolBarDown.add(new JButton(new AbstractAction("Save Table") {
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
}));


}

public void createTable(Class c, Class cAncestor) {
beanTableModel = new BeanTableModel(c, cAncestor);
table = new JTable(beanTableModel);
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
}

public void createTable(Class c, Class cAncestor, List data) {
beanTableModel = new BeanTableModel(c, cAncestor, data);
table = new JTable(beanTableModel);
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
beanTableModel.fireTableDataChanged();
}

public void createTable(Class c) {
beanTableModel = new BeanTableModel(c);
table = new JTable(beanTableModel);
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
}

public void createTable(Class c, List data)
{
beanTableModel = new BeanTableModel(c, data);
table = new JTable(beanTableModel);
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
}

//to refresh the table everytime there is an update
public void fireTableDataChanged()
{
beanTableModel.fireTableDataChanged();
}

所以,我的问题是:这不是我的JTable吗?每次向其发送新数据时,没有更新新结果?

最佳答案

您永远不应该手动调用 fireTableDataChanged。只有 TableModel 负责调用此事件。

从您的代码看来,您每次进行更改时都会创建一个新的 TableModel、JTable 和 JScrollPane。每当您将组件添加到可见 GUI 时,基本代码应该是:

panel.add(....);
panel.revalidate();
panel.repaint();

默认情况下,所有组件的大小都为零,因此由于您不调用 revalidate() ,因此永远不会获得正确的大小,并且没有任何内容可绘制。此外,简单地继续将组件添加到面板的中心绝不是一个好主意,因为旧组件仍然是容器的一部分。

但是,有一个更好的解决方案。无需不断创建新组件。您需要做的就是创建一个新的 TableModel,然后使用:

table.setModel( newlyCreatedModel );

模型将被添加到表格中,表格将自动重新绘制。

关于java - JTable (BeanTableModel) 不更新/刷新 - Java Swing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348370/

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