单击JButton时Java JTable发生更改

问题描述

我有一个带有表的数据库。我将表的名称传递给按钮。单击时,您需要一个带有字段和填充的表格。问题是,每次单击按钮时,我都会添加一个新表。

有人可以告诉我该怎么做吗?预先感谢!

public class App extends JPanel {

static List<FieldElement> fields = new ArrayList<>();
static List<Map<String,Object>> data = new ArrayList<>();
static JTable jTable = new JTable();

public static void createGUI() throws SQLException {

    TableContent tableContent = new TableContent();
    JFrame frame = new JFrame();
    MetadataHelper databaseMetadata = new MetadataHelper();
    List<ButtonElement> elements = databaseMetadata.showTables();
    JPanel panel = new JPanel();

    JPanel buttons = new JPanel(new GridLayout(0,1));
    for (ButtonElement buttonElements : elements) {
        JButton jButton = new JButton(buttonElements.getTablesInMigrateSchema());
        buttons.add(jButton);
        jButton.addActionListener(new ActionListener() {
            @SneakyThrows
            @Override
            public void actionPerformed(ActionEvent e) {
                fields = tableContent.getDatabaseMetadata().showFields(buttonElements.getTablesInMigrateSchema());
                data = tableContent.getDatabaseMetadata().selectAll(buttonElements.getTablesInMigrateSchema());
                Object[][] objectRows = data.stream().map(m -> m.values().toArray()).toArray(Object[][]::new);
                jTable = new JTable(objectRows,fields.toArray());
                panel.add(new JScrollPane(jTable));
                frame.revalidate();
                frame.repaint();
                
            }
        });

    }

    panel.add(buttons,BorderLayout.EAST);
    frame.add(panel);
    frame.setTitle("SwingSandbox");
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();

}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @SneakyThrows
        public void run() {
            JFrame.setDefaultLookAndFeelDecorated(true);
            createGUI();
        }
    });
}

}

enter image description here

解决方法

一种简单的可能性是将JScrollPane存储在变量中(该变量保存要删除的表):

static JTable jTable = new JTable();
static JScrollPane jScrollPane;

然后在您的actionPerformed方法中:

public void actionPerformed(ActionEvent e) {
 ...
                if (jScrollPane != null) {
                  panel.remove(jScrollPane);
                }
                jTable = new JTable(objectRows,fields.toArray());
                jScrollPane = new JScrollPane(jTable);
                panel.add(jScrollPane);
                frame.revalidate();
                frame.repaint();
                
            }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...