简体   繁体   English

单击 JButton 时 Java JTable 会发生变化

[英]Java JTable changes when click on JButton

I have a database with tables.我有一个带表的数据库。 I passed the name of the tables into the buttons.我将表格的名称传递到按钮中。 When you click, you need a table with fields and filling to appear.单击时,您需要一个带有字段和填充的表格才能出现。 The problem is that I have a new table added every time I click on the button.问题是每次单击按钮时都会添加一个新表。

Can someone please say me how to do it?有人可以告诉我该怎么做吗? Thanks in advance!提前致谢!

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();
        }
    });
}

} } 在此处输入图片说明

One easy possibility is to store the JScrollPane in a variable (which holds your table that you want to remove):一种简单的可能性是将 JScrollPane 存储在一个变量中(它保存您要删除的表):

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

And then in your actionPerformed method:然后在您的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();
                
            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM