当前位置: 首页 > 知识库问答 >
问题:

尝试使用DefaultTableModel将数据动态添加到JTable中,但它不起作用

潘楚
2023-03-14

我试图使用DefaultTableModel动态地向JTable添加数据,但是它不起作用。

我创建了两个类:一个类(Input.java)代表一个弹出窗口,允许你写数据(名称,选项和约束)并保存。另一个类表示一个弹出窗口,其中包含一个表(InputMain.java)。然后,InputMain会将这些信息(如果收到的话)转换为表格中的一行,在三列中列出所有这些信息。在Input中,我创建了InputMain的一个实例,并将表的模型设置为一个新的DefaultTableModel()(如果我不这样做,就会抛出一个错误)(InputMain中已经创建了一个表,所以如果我创建了InputMain的一个实例,我很可能是在InputMain中调用该表)。然后,根据actionPerformed(ActionEvent e),在JPanel中单击“enter”按钮后,它将创建一个包含nameText、optionText和constraintText的新数据数组。最后,数据将被添加到模型中。

我不知道为什么我不能把所有这些数据添加到表格中,除了上面的方法对我来说听起来合乎逻辑。

这是InputMain。java类:

    package com.company;

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

/**
 * Created by paull on 14/5/2016.
 */
public class InputMain {
    JButton add;
    JButton change;
    JButton delete;
    JTable table;
    String[] columns;
    String[][] data;
    JButton create;
    JPanel labelPanel;
    JPanel bigPanel;
    JPanel centerPanel;

    public InputMain() {
        int fontSize = 50;
        add = new JButton("add");
        change = new JButton("change");
        delete = new JButton("delete");
        create = new JButton("create");
        columns = new String[]{"name","option","constraint"};
        data = new String[][]{{"","",""}};

        table = new JTable(data,columns) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false; //to avoid it from being changable by double clicking any data
            }
        };
        table.setPreferredScrollableViewportSize(new Dimension(450,63));
        table.setFillsViewportHeight(true);

        JScrollPane jsp = new JScrollPane(table); // not always can the table be fully shown --> add a scrollbar


        add.setFont(new Font(add.getName(),Font.PLAIN,fontSize));
        change.setFont(new Font(add.getName(),Font.PLAIN,fontSize));
        delete.setFont(new Font(add.getName(),Font.PLAIN,fontSize));
        create.setFont(new Font(add.getName(),Font.PLAIN,fontSize));
        table.setFont(new Font(table.getName(),Font.PLAIN,fontSize));
        //table.getEditorComponent().setFont(new Font(add.getName(),Font.PLAIN,fontSize));
        table.getTableHeader().setFont(new Font(table.getName(),Font.PLAIN,fontSize));

        labelPanel = new JPanel();
        labelPanel.add(add);
        labelPanel.add(change);
        labelPanel.add(delete);
        labelPanel.setLayout(new FlowLayout(10,30,10));

        centerPanel = new JPanel();
        centerPanel.add(labelPanel);
        centerPanel.setLayout(new GridBagLayout());

        bigPanel = new JPanel();
        bigPanel.setLayout(new GridLayout(3,0));
        bigPanel.add(centerPanel);
        bigPanel.add(jsp);
        bigPanel.add(create);

        add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                InputFrame s = new InputFrame();
                Input i = new Input();
                s.add(i.labelPanel);
                s.setVisible(true);
            }
        }); // pressing add button pops up the Input Frame

    }

}

这是Input.java的课程:

package com.company;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created by paull on 14/5/2016.
 */
public class Input extends JPanel{

    JLabel nameLabel;
    JLabel optionLabel;
    JLabel constraintLabel;
    JButton enter;
    JPanel labelPanel;
    JPanel jp2;
    JPanel jp3;
    JPanel jp4;
    JTextField nameText;
    String[] optionStrings;
    JComboBox<String> optionText;
    JCheckBox wk1;
    JCheckBox wk2;
    JCheckBox wk3;
    JCheckBox wk4;
    JCheckBox wk5;


    public Input() {
        nameLabel = new JLabel("name: ");
        optionLabel = new JLabel("option: ");
        constraintLabel = new JLabel("constraint:");
        enter = new JButton("add");
        nameText = new JTextField(10);
        Options c = new Options();
        optionStrings = new String[]{c.satNight,c.sunEight,c.sunNineThirty,c.sunEleven,c.sunNight};
        optionText = new JComboBox<String>(optionStrings);
        wk1 = new JCheckBox("1");
        wk2 = new JCheckBox("2");
        wk3 = new JCheckBox("3");
        wk4 = new JCheckBox("4");
        wk5 = new JCheckBox("5");


        int fontSize = 50;
        nameLabel.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        optionLabel.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        constraintLabel.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        enter.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        nameText.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        optionText.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        wk1.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        wk2.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        wk3.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        wk4.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));
        wk5.setFont(new Font(nameLabel.getName(),Font.PLAIN,fontSize));

        labelPanel = new JPanel();
        labelPanel.add(nameLabel);
        labelPanel.add(nameText);
        labelPanel.add(optionLabel);
        labelPanel.add(optionText);
        labelPanel.add(constraintLabel);
        labelPanel.add(wk1);
        labelPanel.add(wk2);
        labelPanel.add(wk3);
        labelPanel.add(wk4);
        labelPanel.add(wk5);
        labelPanel.add(enter);
        labelPanel.setLayout(new FlowLayout(10,30,10));


        InputMain i = new InputMain();
        i.table.setModel(new DefaultTableModel());
        DefaultTableModel model = (DefaultTableModel) i.table.getModel();

        enter.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String constraintText = "";
                String[] data = new String[]{nameText.getText(),optionText.getSelectedItem().toString(),constraintText};
                model.addRow(data);

                nameText.setText("");

            }
        });

    }


}

提前感谢。

共有1个答案

谭繁
2023-03-14

我认为问题在于输入主屏幕的操作性能

       add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                InputFrame s = new InputFrame();
                Input i = new Input();
                s.add(i.labelPanel);
                s.setVisible(true);
            }
        });

构造输入的新实例。这意味着您创建一个新的空的默认表模型,并在每次单击添加按钮时将其附加到表中。尝试将输入的构造移到操作之外执行如下:

         Input i = new Input();
         add.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    InputFrame s = new InputFrame();                    
                    s.add(i.labelPanel);
                    s.setVisible(true);
                }

UPDATE当然,Input中InputMain的实例化也应该删除。相反,在Input中有一个InputMain类型的成员:

private InputMain inputMain;

并更改输入的构造函数来设置值:

public Input (InputMain inputMain) {
    this.inputMain = inputMain;
    ...

并将输入在输入主屏幕中的实例化更改为

Input i = new Input(this);
 类似资料:
  • 我知道我们不应该使用==但是。equal()方法在IntelliJ或Idk中不起作用。如果不是IntelliJ,那就错了。有人能看一下吗。

  • 我的GridbagLayout有些问题。我创建了一个JPanel(在本例中称为mainPanel),它的布局被设置为GridBagLayout。我已经为每个JButton指定了约束,并将约束添加到每个Button。现在,当我运行代码时,按钮总是紧挨着的,而不考虑我在约束中指示的Gridx/Gridy值。此外,按钮总是位于JFrame的中心,我希望一个按钮出现在右上角、左上角和南边。 这是我运行代码

  • Im使用AJAX向datatable添加多行,其中包含一个复选框作为元素。我已经为复选框编写了一个代码,在选择/取消选择'select-all'之后,tbody中的所有子复选框都应该相应地被选中或取消选中。并且在手动选择/取消选择任何子复选框后,“选择-全部”复选框应该会更改。但这部分不起作用。

  • > 我创建了一个函数,在该函数中我创建了表 我创建了另一个函数,它将我的数据从arraylist发布到我的表中。 到现在为止一切都很好。当我试图更新我的时,问题就出现了。实际上,我打开一个并尝试在列表中添加一个新项。我开始使用新项修改,但之后无法更新表,例如,我真的不知道将放在哪里,以及如何在需要时调用它。 我已经在这个网站上看到了一些问题,但我尝试的没有一个真正适用于我的程序。谢谢你的帮助,对不

  • 我正在尝试编写代码,将一行添加到。我打字,但什么也没显示。我的也有一个错误。 有人知道我怎么重写代码吗?

  • 所以我正在做一个项目,其中有一个数据库是我用Symfony5创建的,我使用easyAdmin作为 我尝试将html代码放置为: ,但网站显示给我的是: ,而不仅仅是测试。是因为它是一根绳子吗?我如何设法显示只是测试? 谢谢