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

标签 java swing jtable tablemodel

我有 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/

相关文章:

java - 无法加载 JDBC 驱动程序类

java - 如何诱发SwingWorker错误

java - 具有 protected 和可选择单元格的 Jtable

java - 是否有任何简单的方法可以通过 API 了解 Salesforce 中的架构是否发生变化?

java - 如何在Android中使用服务器发送的事件(SSE)?

java - 使用发送重定向到 JSP

java - 模态对话框并不总是位于未装饰框架的顶部

java - 父对话框状态更改为不可见,但子对话框仍然保持可见

java - 如何比较字符串以获取缺失的单词?

java - JTable 行标题文本