Java 如何设置JTable中特定单元格的值?

Java 如何设置JTable中特定单元格的值?,java,swing,jtable,Java,Swing,Jtable,我只想知道如何更新JTable中的特定单元格 例如,如果我想将单元格(1,1)的值设置为测试值 我的代码如下所示,但不适用于我: String s = "Test Value"; tableName.setValueAt((Object)s, 1, 1); 您可能希望使用DefaultTableModel#setValueAt() 首先需要使用DefaultTableModel DefaultTableModel model = new DefaultTableModel(data, col

我只想知道如何更新JTable中的特定单元格

例如,如果我想将单元格(1,1)的值设置为
测试值

我的代码如下所示,但不适用于我:

String s = "Test Value";
tableName.setValueAt((Object)s, 1, 1);

您可能希望使用
DefaultTableModel#setValueAt()

首先需要使用
DefaultTableModel

 DefaultTableModel model = new DefaultTableModel(data, cols);
 JTable table = new JTable(model);

您可以运行此示例以查看

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestTable {
    String[] cols = {"Col 1", "Col2"};
    String[][] data = {{"Hello", "World"},{"Hello", "World"}};
    DefaultTableModel model = new DefaultTableModel(data, cols);
    JTable table = new JTable(model);
    JButton button = new JButton("Set Value at 1, 1");
    JTextField text = new JTextField(20);

    public TestTable() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(table, BorderLayout.NORTH);
        panel.add(text, BorderLayout.CENTER);
        panel.add(button, BorderLayout.SOUTH);

        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                String value = text.getText();
                model.setValueAt(value, 1, 1);
            }
        });

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);

    }

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


使用产品类编辑


“我创建了一个包含8个字段的类产品,我要做的是使用循环将ArrayList中的数据填充到我的表中”

您想使用
.addRow
动态添加行。您需要从每个
产品
中获取每个字段,并将其排成一行。然后像这样添加该行。注意:您应该使用
getters
,但为了简单起见,我没有使用

for (Product p : list) {
    String data1 = p.field1;
    int data2 = p.field2;
    int data3 = p.field3;
    int data4 = p.field4;
    int data5 = p.field5;
    int data6 = p.field6;
    int data7 = p.field7;
    int data8 = p.field8;

    Object[] row = {data1, data2, data3, data4, data5, data6, data7, data8};
    model.addRow(row);

}

导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.*;
导入javax.swing.table.DefaultTableModel;
公共类测试表{
字符串[]cols={“第1列”、“第2列”、“第3列”、“第4列”、“第5列”、“第6列”、“第7列”、“第8列”};
DefaultTableModel=新的DefaultTableModel(cols,0);
JTable table=新的JTable(模型);
JButton按钮=新JButton(“设置表”);
名单;
公共测试表(){
JPanel panel=newjpanel(newborderlayout());
添加(新的JScrollPane(表),BorderLayout.CENTER);
面板。添加(按钮,边框布局。南);
list=getOneRow();
addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
用于(产品p:列表){
字符串data1=p.field1;
int data2=p.field2;
int data3=p.field3;
int data4=p.field4;
int data5=p.field5;
int data6=p.field6;
int data7=p.field7;
int data8=p.field8;
Object[]行={data1,data2,data3,data4,data5,data6,data7,data8};
model.addRow(row);
}
}
});
JFrame=新JFrame();
框架。添加(面板);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共列表getOneRow(){
列表=新的ArrayList();
添加(新产品(“产品1”、1、2、3、4、5、6、7”);
添加(新产品(“产品2”、1、2、3、4、5、6、7”);
添加(新产品(“产品3”、1、2、3、4、5、6、7”);
添加(新产品(“产品4”、1、2、3、4、5、6、7”);
退货清单;
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
新的TestTable();
}
});
}
}
类产品{
字符串字段1;
int field2;
国际领域3;
国际字段4;
int FIELD 5;
int field6;
int field7;
int field8;
公共产品(字符串s、整数f2、整数f3、整数f4、整数f5、整数f6、整数f7、整数f8){
字段1=s;
字段2=f2;
字段3=f3;
字段4=f4;
字段5=f5;
字段6=f6;
字段7=f7;
field8=f8;
}  
}

上面的代码有什么问题?使用的是什么表格型号?谢谢,很好的信息。但是我的错,我发布了不完整的细节,我使用的是8个字段的ArrayList,而不是二维数组。那么你到底有什么问题?你想用arrayList做什么?它只是一行表数据吗?我创建了一个包含8个字段的类Products,我要做的是使用循环将ArrayList中的数据填充到我的表中。请参阅我的编辑。我制作了一个快速的产品类,向您展示如何做到这一点。您只需要获取所有字段并将其用于一行。并添加该行。你可以运行它
for (Product p : list) {
    String data1 = p.field1;
    int data2 = p.field2;
    int data3 = p.field3;
    int data4 = p.field4;
    int data5 = p.field5;
    int data6 = p.field6;
    int data7 = p.field7;
    int data8 = p.field8;

    Object[] row = {data1, data2, data3, data4, data5, data6, data7, data8};
    model.addRow(row);

}
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestTable {
    String[] cols = {"Col 1", "Col 2", "Col 3", "Col 4", "Col 5", "Col 6", "COl 7", "Col 8"};
    DefaultTableModel model = new DefaultTableModel(cols, 0);
    JTable table = new JTable(model);
    JButton button = new JButton("Set Table");
    List<Product> list;

    public TestTable() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(new JScrollPane(table), BorderLayout.CENTER);
        panel.add(button, BorderLayout.SOUTH);

        list = getOneRow();

        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                for (Product p : list) {
                    String data1 = p.field1;
                    int data2 = p.field2;
                    int data3 = p.field3;
                    int data4 = p.field4;
                    int data5 = p.field5;
                    int data6 = p.field6;
                    int data7 = p.field7;
                    int data8 = p.field8;

                    Object[] row = {data1, data2, data3, data4, data5, data6, data7, data8};
                    model.addRow(row);

                }
            }
        });

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public List<Product> getOneRow() {
        List<Product> list = new ArrayList<>();
        list.add(new Product("Product 1", 1, 2, 3, 4, 5, 6, 7));
        list.add(new Product("Product 2", 1, 2, 3, 4, 5, 6, 7));
        list.add(new Product("Product 3", 1, 2, 3, 4, 5, 6, 7));
        list.add(new Product("Product 4", 1, 2, 3, 4, 5, 6, 7));


        return list;
    }


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

class Product {
    String field1;
    int field2;
    int field3;
    int field4;
    int field5;
    int field6;
    int field7;
    int field8;

    public Product(String s, int f2, int f3, int f4, int f5, int f6, int f7, int f8) {
        field1 = s;
        field2 = f2;
        field3 = f3;
        field4 = f4;
        field5 = f5;
        field6 = f6;
        field7 = f7;
        field8 = f8;

    }  
}