当前位置: 首页 > 面试题库 >

我想在单击按钮时更新表

后化
2023-03-14
问题内容

我是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(模型-视图-
控制
),该视图将视图(JTable)与数据/模型(TableModel)分开,这意味着JTable不会绑定到数据,并且可以通过简单地更改或修改来轻松更改或修改。表格的模型。这是一个重要的概念,因为Swing大量使用了这种方法



 类似资料:
  • 问题内容: 我正在使用此处找到的自定义表格模型。我已经使用该帖子中提供的建议更新了我的代码,并遇到了一个新问题。我对我的代码所做的改变是一个注入到我,以避免与线程的问题。完成此操作后,通过按按钮更新我的表的代码已停止工作。 用于初始化的代码如下: 我用来更新的代码如下: 我也尝试过使用,但这也不起作用。截至目前,更新的唯一方法是关闭并重新打开程序。具有我正在使用的,随着用户添加更多玩家,尺寸会增加

  • 我需要帮助创建一个div,当你点击一个按钮时,里面有自定义超文本标记语言的div会被创建。 如果这是可能的(很可能是),我正在制作一个邮箱。 谢谢!!!

  • 我试图更新下载按钮点击数据库列。似乎很容易,但当我点击按钮数据库中的计数器不更新。 我不确定这是否是最佳和正确的方法,但这是我到目前为止所做的。 一个输入字段,用户从API中提取图像 当图像加载有显示按钮下载和用户可以下载它 另外,当用户搜索图像时,我会将搜索的内容保存在数据库中。这是我的控制器函数,用于将图像保存在数据库中的搜索字符串中。这很好用 这是下载时更新按钮单击的功能 视图中的按钮 路线

  • 这是我的按钮单击事件。我想在每次单击按钮时创建组合框。 私有void jButton1ActionPerformed(java.awt.event.ActionEvent evt){ });

  • 我正在做一个计数计时器使用按钮开始和停止。 我需要帮助解决这个...当我按下“Start”按钮时,它可以工作(使用)但是不会为我更新。 但是,如果将放在而不是在settext会更新...但我没有按“开始”键。如何使setText在“开始”按钮被按下后更新?

  • 我正在使用和这里找到的自定义表模型。我已经用那篇文章中提供的建议更新了我的代码,遇到了一个新问题。我对代码所做的更改是注入<code>ArrayList 用于初始化< code>JTable的代码如下: 我用来更新< code>JTable的代码如下: 我也尝试过使用但这也不起作用。截至目前,使更新的唯一方法是关闭并重新打开程序。具有我用于的,随着用户添加更多玩家,其大小会增加。 为什么< cod