java - 我想在单击按钮时更新表格

标签 java swing jtable actionlistener defaulttablemodel

我是 Swing 新手。

我想在单击按钮(完成按钮)后更新表格。 我认为数据正确,但屏幕不工作。

以下是我的程序的说明

  1. 选中复选框并单击“完成”按钮
  2. 底层应该改变。
  3. 没有主要内容

这是我的代码:

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;

import net.miginfocom.swing.MigLayout;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Gui extends JFrame {

    class Table extends JTable{
        public Table(DefaultTableModel model) {
            super(model);
        }
        public Class getColumnClass(int column) {
            switch (column) {
            case 1:
                return Boolean.class;
            default:
                return String.class;
            }
        }
    }

    private final int BANDNUM = 43;
    int[] checkBands;
    Object[][] data;
    Table table;
    JScrollPane upperScrollpane;
    JScrollPane downScrollPane;
    JSplitPane splitPane;

    public Gui() {

        // BASE SETTING
        setSize(900, 800);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout(5, 5));

        JPanel northPanel = new JPanel(new MigLayout());

        // northPanel SETTING
        JLabel labelIp = new JLabel("IP");
        JTextField tFIp = new JTextField(20);

        JLabel labelMask = new JLabel("Subnet Mask");
        JTextField tFMask = new JTextField(20);

        JLabel labelPing = new JLabel("Ping");
        JTextField tFPing = new JTextField(10);

        JButton btnReady = new JButton("Ready");
        JLabel labelReady = new JLabel("NOT READY");

        northPanel.add(labelIp);
        northPanel.add(tFIp);
        northPanel.add(labelMask);
        northPanel.add(tFMask);
        northPanel.add(labelPing);
        northPanel.add(tFPing);
        northPanel.add(btnReady);
        northPanel.add(labelReady, "wrap");

        // upper scrollpane -> will be included in JsplitPane Upper Side
        JPanel checkPanel = new JPanel(new MigLayout());

        JCheckBox[] checkBoxes = new JCheckBox[BANDNUM];
        JButton doneButton = new JButton("DONE");

        for (int i = 0; i < BANDNUM; i++) {
            checkBoxes[i] = new JCheckBox("" + (i + 1));
            checkBoxes[i].setHorizontalTextPosition(SwingConstants.CENTER);
            checkBoxes[i].setVerticalTextPosition(SwingConstants.BOTTOM);
            if (i == 32) {
                checkPanel.add(checkBoxes[i], "wrap");
            } else if (i == 42) {
                checkPanel.add(checkBoxes[i], "wrap");
            } else {
                checkPanel.add(checkBoxes[i]);
            }
        }

        checkPanel.add(doneButton, "span 3");

        // startButton Action

        /////////////////////////////////////////
        //I think you should watch from this line!!!
        /////////////////////////////////////////
        doneButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // 1. CHECK WHAT ARE CLICKED
                int length = 0;
                for (int i = 0; i < BANDNUM; i++)
                    if (checkBoxes[i].isSelected())
                        length++;
                checkBands = new int[length];

                System.out.println(length);

                int k = 0;
                for (int i = 0; i < BANDNUM; i++) {
                    if (checkBoxes[i].isSelected()) {
                        checkBands[k++] = i + 1;
                    }
                }

                // 2. Ready for display
                data = new Object[length][6];
                for (int i = 0; i < length; i++) {
                    data[i][0] = checkBands[i];
                    data[i][1] = true;
                    data[i][2] = 1;
                    data[i][3] = 2;
                    data[i][4] = 3;
                    data[i][5] = 4;
                }

                // 3. display
                String[] colNames = { "BAND", "Test1", "Test2", "Test3",
                        "Test4", "Test5" };
                DefaultTableModel model = new DefaultTableModel(data, colNames);
                table = new Table(model);
                setVisible(true);
                table.repaint();
                downScrollPane.repaint();
                splitPane.repaint();
            }
        });

        // down scrollpane -> will be included in JsplitPane down Side
        String[] colNames = { "BAND", "Test1", "Test2", "Test3", "Test4",
                "Test5" };
        Object[][] data = { { null, null, null, null, null, null }};
        DefaultTableModel model = new DefaultTableModel(data, colNames);
        table = new Table(model);

        // include
        upperScrollpane = new JScrollPane(checkPanel);
        downScrollPane = new JScrollPane(table);

        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upperScrollpane, downScrollPane);

        mainPanel.add(northPanel, BorderLayout.NORTH);
        mainPanel.add(splitPane, BorderLayout.CENTER);
        getContentPane().add(mainPanel);

        setVisible(true);

    }

}

最佳答案

而不是这样做......

String[] colNames = { "BAND", "Test1", "Test2", "Test3",
                    "Test4", "Test5" };
DefaultTableModel model = new DefaultTableModel(data, colNames);
table = new Table(model);

只需更新现有模型

DefaultTableModel model = (DefaultTableModel)table.getModel();
for (Object[] row : data) {
    model.addRow(row);
}

或者简单地

DefaultTableModel model = (DefaultTableModel)table.getModel();
for (int i = 0; i < length; i++) {
    data = new Object[6];
    data[0] = checkBands[i];
    data[1] = true;
    data[2] = 1;
    data[3] = 2;
    data[4] = 3;
    data[5] = 4;
    model.addRow(data);
}

这假设您想要不断向表中添加新行。您还可以使用 model.setRowCount(0) 首先清除表格,然后向其中添加新行(如果您愿意的话)。

Swing 的工作原理是 MVC ( Model-View-Controller ),它将 View (JTable) 与数据/模型 (TableModel) 分开,这意味着 JTable 不绑定(bind)到数据,只需更改或修改表的模型即可轻松更改或修改。这是一个需要理解的重要概念,因为 Swing 大量使用了这种方法

关于java - 我想在单击按钮时更新表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30117334/

相关文章:

java - 缓存控制被忽略

java - 跨服务器同步 webapps

java - 当值更改时,JTable 会更改整个列的颜色 - Swing

java - 更新 SwingWorker 中的 JTable

java - 如何出于测试目的关闭 ehcache

java - 从 0 到 99999 之间的数字中提取数字

java - 连接具有 StringConverter 的 slider 和微调器

java - JPasswordField.getPassword() 的安全原因是什么?

java - 使用 fillRect 在 JFrame 内的 JPanel 上绘图 - 矩形大小调整和位置问题?

java - jTable中两列数据的乘法