【问题标题】:How would I add data to a JTable?如何将数据添加到 JTable?
【发布时间】:2014-05-31 11:34:48
【问题描述】:

我希望我的用户能够输入允许他们填充 JTable 的 4 个字段。我在CreateFxitures 类中有一个JPanel。在这个 JPanel 上,他们可以将数据输入到两个 ComboBox 和 2 个 TextField 中。一旦这些数据全部输入,他们应该单击Create 按钮,这会将所有数据添加到输入到表中的rowNames 数组中。但是,当他们单击 Create 时,该行会创建一个新行,但不会添加数据。我该怎么做呢?

主类:

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Main 
{

    public Main()
    {
        final JFrame window = new JFrame ("AQA Computer Science Application");

        final CardLayout c1 = new CardLayout();
        final JPanel container = new JPanel(c1);

        Home homeCall = new Home();
        GuestFixtures guestCall = new GuestFixtures();
        final Login loginCall = new Login();
        final AdminFixtures adminCall = new AdminFixtures();
        final CreateFixtures createCall = new CreateFixtures();

        container.add(homeCall, "1");
        container.add(guestCall, "2");
        container.add(loginCall, "3");
        container.add(adminCall, "4");
        container.add(createCall, "5");
        createCall.createB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {

                if (createCall.descTF.getText().equals("")){
                    JOptionPane.showMessageDialog(null, "All fields must be entered");
                }else{
                    c1.show(container, "4");

                    adminCall.model.addRow(createCall.rowData);

                }

            }
        });

    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Main();
            }
        });

    }

}

创建夹具:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class CreateFixtures extends JPanel
{

    JButton backB, createB;
    JLabel typeL, descL, dateL, resultL;
    JComboBox typeCB, monthCB, dayCB;
    JTextField descTF, resultTF;
    String[] typeCBSTR = { "Football", "Tennis", "Swimming"};
    String[] monthCBSTR = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    String[] dayINT = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", };
    Object typeObject, monthObject;
    String typeSTR, descSTR, monthSTR, resultSTR;
    protected Vector rowData;
    public CreateFixtures()
    {

        final AdminFixtures adminCall = new AdminFixtures();

        this.setLayout(new BorderLayout());

        JPanel createC = new JPanel(new GridLayout(12, 4));
        typeL = new JLabel("Type of Sport");
        typeCB = new JComboBox(typeCBSTR);
        descL = new JLabel("Description");
        descTF = new JTextField();
        dateL = new JLabel("Date");
        monthCB = new JComboBox(monthCBSTR);
        dayCB = new JComboBox(dayINT);
        resultL = new JLabel("Result");
        resultTF = new JTextField("TBA");

        createC.add(typeL);
        createC.add(typeCB);
        createC.add(descL);
        createC.add(descTF);
        createC.add(dateL);
        createC.add(monthCB);
        createC.add(dayCB);
        createC.add(resultL);
        createC.add(resultTF);

        typeObject = typeCB.getSelectedItem();
        typeSTR = typeObject.toString();
        descSTR = descTF.getText();
        monthObject = monthCB.getSelectedItem();
        resultSTR = resultTF.getText();

        Object[] rowData = {typeSTR, descSTR, monthSTR, resultTF};

        JPanel createS = new JPanel(new FlowLayout());
        backB = new JButton("Back");
        createB = new JButton("Create");

        createS.add(backB);
        createS.add(createB);

        createC.setBackground(Color.LIGHT_GRAY);
        createS.setBackground(Color.GRAY);

        add(createC, BorderLayout.CENTER);
        add(createS, BorderLayout.SOUTH);


    }

}

AdminFixtures:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class AdminFixtures extends JPanel
{

    JButton backB, createFixturesB, deleteButton;
    JTable adminFixturesTable;
    String[] columnNames = {"Fixture", "Description", "Date", "Result"};
    String[][] rowNames = null;
    DefaultTableModel model;

    public AdminFixtures()
    {

        this.setLayout(new BorderLayout());

        JPanel adminC = new JPanel();
        adminFixturesTable = new JTable(new DefaultTableModel(rowNames, columnNames));
        JScrollPane scrollpane = new JScrollPane(adminFixturesTable);
        model = (DefaultTableModel) adminFixturesTable.getModel();

        JPanel adminS = new JPanel(new FlowLayout());
        backB = new JButton("Back");
        createFixturesB = new JButton("New Fixture");
        deleteButton = new JButton("Delete Row");

        adminS.add(backB);
        adminS.add(createFixturesB);
        adminS.add(deleteButton);

        adminC.setBackground(Color.LIGHT_GRAY);
        adminS.setBackground(Color.GRAY);

        add(scrollpane, BorderLayout.CENTER);
        add(adminS, BorderLayout.SOUTH);

    }

}

【问题讨论】:

  • 你的设计似乎很奇怪。您从Main 类内部将侦听器添加到CreateFixtures 的组件,同时引用在Main 类中创建的新AdminFixtures,以尝试更改CreateFixtures 中的AdminFixtures .这似乎是你的问题。设计你的程序。应该在 that 类中添加一个类的监听器
  • 基本上,我有MAIN,其中包含主 JPanel 并调用其他卡(类)。每个类都是一个使用 CardLayout 的新 JPanel,当它想要显示时由 MAIN 调用。这不是关于听众的问题,因为我在Main 中有许多其他听众,他们没有造成任何问题。
  • CreateFixtures 中的按钮也是 supposed 添加一行,而不是 its AdminFixtures 模型,而是 AdminFixtures您在Main? 中创建的模型?
  • 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。
  • 我不知道我在Main 中创建了一个模型。基本上,Main 中的 Listener 应该向 Admin Fixtures 中的模型添加一个新行,并将来自CreateFxitures 的数据添加到该行中。

标签: java swing jtable defaulttablemodel


【解决方案1】:

首先使用getText() 获取字段值。然后从值创建一个对象数组。然后像你一样使用addRow(array)。您当前尝试添加的数组包含所有空值。因此,您只需要获取文本字段的当前值,然后添加行。忘记createCall.rowData。它对你没有任何作用。每次按下按钮时创建一个新的Object[]。类似的东西

String data1 = typeSTR.getText();
String data2 = descSTR.getText();
String data3 = monthSTR.getText();
String data4 = resultSTR.getText();
Object[] row = { data1, data2, data3, data4 };
model.addRow( row );   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2017-09-19
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多