Java 单击按钮时JXTable未刷新

Java 单击按钮时JXTable未刷新,java,swing,event-handling,jtable,swingx,Java,Swing,Event Handling,Jtable,Swingx,我有一个JFrame,它包含一个JXTable(来自SwingX依赖项)和一个JButton 单击JButton后,表应该每次都会更新。在我的例子中,它只在第一次更新。其他事件也会在单击按钮时触发(每次单击按钮时都会发生)。只有添加了新行的表才不会刷新 我正在使用deafultablemodel,并尝试了(显式触发器)所有建议的方法,如repaint,fireTableDataChanged等 有人能帮忙吗 编辑-1(添加了代码段):- //单击“验证”按钮时将执行操作 validateBut

我有一个
JFrame
,它包含一个
JXTable
(来自SwingX依赖项)和一个
JButton

单击JButton后,表应该每次都会更新。在我的例子中,它只在第一次更新。其他事件也会在单击按钮时触发(每次单击按钮时都会发生)。只有添加了新行的表才不会刷新

我正在使用
deafultablemodel
,并尝试了(显式触发器)所有建议的方法,如
repaint
fireTableDataChanged

有人能帮忙吗

编辑-1(添加了代码段):-

//单击“验证”按钮时将执行操作
validateButton.addActionListener(新ActionListener(){
已执行的公共无效行动(最终行动事件ae){
if(evCheckbox1.isSelected()| |!list.isSelectionEmpty()){
试一试{
//存储验证错误以备将来使用
List validationErrors=validateSheet(Driver.this.fileLocation,List
.getSelectedValuesList(),regulatorTypeCB.getSelectedItem().toString(),sheetTypeCB
.getSelectedItem().toString());
//创建要添加到roTable的验证错误概述
映射tmpMap=getValidationErrorsOverview(validationErrors);
系统输出打印LN(tmpMap);
//创建报告概述表
String[]columnNames={“工作表名称”,“验证名称”,“工作表名称”};
DefaultTableModel tmodel=新的DefaultTableModel(0,0);
tmodel.setColumnIdentifiers(列名称);
JXTable roTable=新的JXTable();
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
roTable.addHighlighter(HighlighterFactory.createSimpleStriping());
List tlist=new ArrayList();
JScrollPane scrPane=新JScrollPane(可旋转);
scrPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HorizontalScrollBar\uAlways);
scrPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
概览面板。添加(scrPane);
//从验证错误概述映射创建一个列表,以在表中作为行插入
对于(Map.Entry:tmpMap.entrySet()){
tlist.add(entry.getKey().split(“:”[0]);
tlist.add(entry.getKey().split(“:”[1]);
tlist.add(String.valueOf(entry.getValue());
}
//在表中添加行
对于(int i=0;i
以下几行中存在一些概念错误:

String[] columnNames = {"SHEET_NAME", "VALIDATION_NAME", "#"};
DefaultTableModel tmodel = new DefaultTableModel(0, 0);
tmodel.setColumnIdentifiers(columnNames);
JXTable roTable = new JXTable();
...
JScrollPane scrPane = new JScrollPane(roTable);
...
overviewPanel.add(scrPane);
1) 按下按钮时不要创建新的
JXTable
,而是通过清除当前表格模型并向其中添加行或直接设置新的表格模型来处理表格模型。例如:

String[] columnNames = {"SHEET_NAME", "VALIDATION_NAME", "#"};
DefaultTableModel tmodel = new DefaultTableModel(0, 0);
tmodel.setColumnIdentifiers(columnNames);
yourTable.setModel(tmodel);
2) 这些行表明,当您试图通过单击按钮添加新表时,
overviewPanel
已经显示,因此,您必须重新验证并重新绘制面板,如下所示:

overviewPanel.add(scrPane);
overviewPanel.revalidate();
overviewPanel.repaint();
然而,虽然我们可以在Swing中动态添加组件,但我们通常会在顶层容器(窗口)可见之前放置所有组件。因此,第1点中描述的方法比这一点更可取,我添加这一点只是为了完整性

3) 请注意,耗时的任务(如数据库调用或IO操作)可能会阻塞GUI,从而导致GUI无响应。EDT是一个单独的特殊线程,Swing组件在其中创建和更新。为了避免阻塞,该线程考虑使用A在后台线程中执行繁重任务,并更新EDT中的Swing组件。请参阅第一课中的更多内容


更新 请考虑下面的例子来说明第1点:

  • 在使顶级容器(窗口)可见之前,将创建并放置该表一次
  • 这两个操作都与表模型一起工作:其中一个操作设置新的表模型,另一个操作清除并重新填充当前表模型
这是代码。希望有帮助

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXTable;

public class Demo {

    private void createAndShowGUI() {

        final JXTable table = new JXTable(5, 6);
        table.setPreferredScrollableViewportSize(new Dimension(500, 200));

        Action resetModelAction = new AbstractAction("Set a new model") {
            @Override
            public void actionPerformed(ActionEvent e) {
                Random random = new Random(System.currentTimeMillis());
                DefaultTableModel model = new DefaultTableModel(0, 6);

                for (int i = 0; i < model.getColumnCount(); i++) {
                    model.addRow(new Object[]{
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt()
                    });
                }

                table.setModel(model);
            }
        };

        Action clearAndFillModelAction = new AbstractAction("Clear and fill model") {
            @Override
            public void actionPerformed(ActionEvent e) {
                Random random = new Random(System.currentTimeMillis());
                DefaultTableModel model = (DefaultTableModel)table.getModel();
                model.setRowCount(0); // clear the model

                for (int i = 0; i < model.getColumnCount(); i++) {
                    model.addRow(new Object[]{
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt()
                    });
                }
            }
        };

        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(new JButton(resetModelAction));
        buttonsPanel.add(new JButton(clearAndFillModelAction));

        JPanel content = new JPanel(new BorderLayout(8,8));
        content.setBorder(BorderFactory.createEmptyBorder(8,8,8,8));
        content.add(new JScrollPane(table));
        content.add(buttonsPanel, BorderLayout.PAGE_END);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().createAndShowGUI();
            }
        });
    }    
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.util.Random;
导入javax.swing.AbstractAction;
导入javax.swing.Action;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
导入javax.swing.table.DefaultTableModel;
导入org.jdesktop.swingx.JXTable;
公开课演示{
私有void createAndShowGUI(){
最终JXTable表=新的JXTable(5,6);
table.setPreferredScrollableViewportSize(新维度(500200));
Action resetModelAction=new AbstractAction(“设置新模型”){
@凌驾
已执行的公共无效操作(操作事件e){
随机随机随机数
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXTable;

public class Demo {

    private void createAndShowGUI() {

        final JXTable table = new JXTable(5, 6);
        table.setPreferredScrollableViewportSize(new Dimension(500, 200));

        Action resetModelAction = new AbstractAction("Set a new model") {
            @Override
            public void actionPerformed(ActionEvent e) {
                Random random = new Random(System.currentTimeMillis());
                DefaultTableModel model = new DefaultTableModel(0, 6);

                for (int i = 0; i < model.getColumnCount(); i++) {
                    model.addRow(new Object[]{
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt()
                    });
                }

                table.setModel(model);
            }
        };

        Action clearAndFillModelAction = new AbstractAction("Clear and fill model") {
            @Override
            public void actionPerformed(ActionEvent e) {
                Random random = new Random(System.currentTimeMillis());
                DefaultTableModel model = (DefaultTableModel)table.getModel();
                model.setRowCount(0); // clear the model

                for (int i = 0; i < model.getColumnCount(); i++) {
                    model.addRow(new Object[]{
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt(),
                        random.nextInt()
                    });
                }
            }
        };

        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(new JButton(resetModelAction));
        buttonsPanel.add(new JButton(clearAndFillModelAction));

        JPanel content = new JPanel(new BorderLayout(8,8));
        content.setBorder(BorderFactory.createEmptyBorder(8,8,8,8));
        content.add(new JScrollPane(table));
        content.add(buttonsPanel, BorderLayout.PAGE_END);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().createAndShowGUI();
            }
        });
    }    
}