如何在用户提供数据时将数据添加到Java中的Jtable,然后在最后获取数据?

时间:2014-02-02 14:37:18

标签: java swing jtable

我想要的是,用户输入文本字段,一旦按下确定,我希望将其添加到jtable,他们添加另一个选项,我希望将其添加到jtable等等。一旦他们添加了它我想获得Jtable的值并执行它说打印出来但是他们添加它的顺序。

我设计了一个组合框,3个文本字段,一个标签,点击后将数据添加到JTable。以下是我目前的代码。

JComboBox comboBox1 = new JComboBox();
    comboBox1.setModel(new DefaultComboBoxModel(new String[] { "NONE","A","B","C","D" }));
    comboBox1.setBounds(40, 20, 200, 40);
    contentPane.add(comboBox1);

JTextField time = new JTextField();
time.setBounds(216, 135, 45, 30);
contentPane.add(time);

JTextField speed1 = new JTextField();
speed1.setBounds(273, 135, 45, 30);
contentPane.add(speed1);

JTextField speed2 = new JTextField();
speed2.setBounds(328, 135, 45, 30);
contentPane.add(speed2);

JLabel label1 = new JLabel("Add this to table");
label1.setBounds(310, 200, 100, 20);
contentPane.add(label1);

JTable table_2 = new JTable();
table_2.setModel(new DefaultTableModel(
    new Object[][] {
        {null, null, null, null},
        {null, null, null, null},
        {null, null, null, null},
        {null, null, null, null},
        {null, null, null, null},
        {null, null, null, null},
    },
    new String[] {
        "New column", "New column", "New column", "New column"
    }
));
table_2.setBounds(20, 200, 360, 100);
contentPane.add(table_2);

用户可以按任何顺序向Jtable添加值,例如用户从组合框中选择A,在场时间中选择2,在场速1中选择10,在场速2中选择10,然后他们添加说B和信息,以及C,D和B再次或任何其他,或者他们只选择1个选项以及执行该选项。

所以说,用户选择或键入B,2,5,6,然后按下添加到表格,我想要添加,他们可以添加更多,让我们说他们添加2更多不同的变化。如何将它们存储在JTable中,然后如果我想按照它们的顺序将它们打印出来,我该怎么做。

感谢。

1 个答案:

答案 0 :(得分:2)

  • 您最初不需要指定一堆空单元格/行。只是我们这个模型的构造函数

    DefaultTableModel(Object[] columnNames, int rowCount)
    

    构造一个DefaultTableModel,其列数与columnNames中的元素和null对象值的rowCount一样多。

    String[] colNames = {"New column", "New column", "New column", "New column"};
    DefaultTableModel model = new DefaultTableModel(colNames, 0);
    ...
    table.setModel(model);
    
  • 然后您可以使用此方法添加行

    public void addRow(Object[] rowData)
    

    在模型的末尾添加一行。除非指定了rowData,否则新行将包含空值。将生成正在添加的行的通知。
    类似于

     String cBoxSelection = (String)comboBox1.getSelectedItem();
     String speed1String = speed1.getText();
     String speed2String = speed2.getText();
     String timeString = time.getText();
    
     String[] row = {cBoxSelection, speed1String, speed2String, timeString};
     model.addRow(row);
    
  • 如果您想遍历模型以打印项目,只需使用这些方法

     getColumnCount()
    

    返回此数据表中的列数。

     getRowCount()
    

    返回此数据表中的行数。

     getValueAt(int row, int column)
    

    返回行和列的单元格的属性值 所以你可以做这样的事情

     for (int i = 0; i < model.getRowCount(); i++ ){
         for (int j = 0; j < model.getColumnCount(); j++) {
             System.out.printf("%10s", model.getValueAt(i, j));
         }
         System.out.println();
     }
    

旁注

  • 如@HovercraftFullOfEels所述,请勿使用null布局。看看Laying out Components Within a Container。布局管理器将使您的布局更灵活,适合不同的外观并感受机器

  • 您应该将JTable包裹在JScrollPane中。

    JScrollPane scroll = new JScrollPane(table);
    contentPane.add(scroll);
    
  • 您应该使用此构造函数

    指定JTextFields的大小
    JTextField(int columns)
    

    其中columns是字段的字符长度。


  

“如何在需要时检索这些值”

您需要使它们成为类成员变量。现在他们看起来像是在构造函数中本地化了。这是我的班级成员的意思

public class MyClass {
    private JTextField time;
    private JTextField speed1;

    public MyClass() {
        time = new JTextField(10);
        speed1 = new JtextField(10);
    }
}

不能在构造函数的外部访问它们,因为它们现在具有全局范围。目前,它们在构造函数中只有 local 范围。