如何获取JTable的数据?

时间:2014-03-01 00:21:20

标签: java swing jtable defaulttablemodel

问题:

当按下保存按钮时,我想将JTable中的信息恢复为String [] [] 2维数组的数组。实际上我想在每次按下一个键时更新一个新的String [] []数组,但是必须等到Save按钮工作。

当我创建ActionListener时,我必须创建另一个TestTable实例,因此我可以传入表,因为我想在主类之外创建所有的ActionListener。

动作侦听器:

            class buttonListener implements ActionListener {
        private String[][] tempTable = null; 
        **TestTable tt = new TestTable();**

        public Object[][] getTableData (JTable table) {
          int nRow = table.getRowCount();
          int nCol = table.getColumnCount();
          String[][] tData = new String[nRow][nCol];

          for (int i = 0 ; i < nRow ; i++) {
            for (int j = 0 ; j < nCol ; j++) {
              tData[i][j] = (String) table.getValueAt(i,j);
            }
          }
            return tData;
        }

        **@Override
        public void actionPerformed(ActionEvent arg0) {
           tempTable = (String[][]) getTableData(tt.t);
        }**
    }

这是简单JTable的代码。

问题:我希望能够在点击按钮时保存数据?

代码:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class TestTable extends JPanel {
    private static final long serialVersionUID = 1L;
      String[] columnNames = {"Col1", "Col2", "Col3", "Col4", "Col5", "Col6", "Col7"};
      Object[][] data = {
            {"A", "B", "C", new Integer(1), new Boolean(true), "AA", "BB"},
            {"D", "E", "F", new Integer(2), new Boolean(false), "CC", "DD"},
            {"G", "H", "I", new Integer(3), new Boolean(true), "EE", "FF"},
            {"J", "K", "L", new Integer(4), new Boolean(false), "GG", "HH"},
            {"M", "N", "O", new Integer(5), new Boolean(true), "II", "JJ"}
      };
      JTable t;

    public TestTable() {
        t = new JTable(data, columnNames);
        t.addMouseListener( new mouseListener());
        t.setPreferredScrollableViewportSize(new Dimension(500, 200));
        JScrollPane scrollPane = new JScrollPane(t);
        add(scrollPane);
        //add(t);
    }

    private void OpenGUI() {
        JButton b1 = new JButton("Save JTable");
        b1.addActionListener(new buttonListener());
        b1.setBounds(0,0,150,150);

        TestTable n = new TestTable();
        JFrame f = new JFrame("...Test JTable...");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(n);
        f.add(b1);
        //f.add(n);
        f.pack();
        f.setVisible(true);
    }

    public Object[][] getTableData (JTable table) {
        int nRow = table.getRowCount();
        int nCol = table.getColumnCount();

        String[][] tData = new String[nRow][nCol];

        for (int i = 0 ; i < nRow ; i++) {
            for (int j = 0 ; j < nCol ; j++) {
                tData[i][j] = (String) table.getValueAt(i,j);
            }
        }

        return tData;
    }

    private void printData(Object[][] d, String[] s) {
        for (int c=0;c<d.length;c++) {
            System.out.println("Column Name: " + s[c]);
            for (int r=0;r<d.length;r++) {
                System.out.print(d[c][r] + " ");
            }
            System.out.println();
        }
    }

    public static void main(String[] MeatBalls) {
        TestTable myClass = new TestTable();
        buttonListener l  = new buttonListener();
        myClass.OpenGUI();
        myClass.printData(myClass.data,myClass.columnNames);
        myClass.data = myClass.getTableData(myClass.t);
        myClass.printData(myClass.data,myClass.columnNames);
    }
}

class buttonListener implements ActionListener {
    private String[][] tempTable = null; 
    TestTable tt = new TestTable();

    public Object[][] getTableData (JTable table) {
      int nRow = table.getRowCount();
      int nCol = table.getColumnCount();
      String[][] tData = new String[nRow][nCol];

      for (int i = 0 ; i < nRow ; i++) {
        for (int j = 0 ; j < nCol ; j++) {
          tData[i][j] = (String) table.getValueAt(i,j);
        }
      }
        return tData;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
       tempTable = (String[][]) getTableData(tt.t);
    }
}

1 个答案:

答案 0 :(得分:1)

您可以采取一些措施来简化此代码(并遵循Java惯例):

  1. 创建保存数据的JTable并显示实例变量。 创建新的JTable。内部类可以访问外部类变量的任何,因此您可以(并且应该)将实例变量设置为私有。

  2. 摆脱外部类中的getTableData方法。你不需要那样。

  3. getTableData方法返回String[][]而不是Object[][]。您在方法中使用了String[][],并且您没有通过返回Object[][]来帮助您。

  4. 触发actionPerformed方法时,使用内部类中的getTableData方法通过外部类中的实例变量获取JTable中的数据。 / p>

  5. 为类名和方法名使用适当的大小写。方法名称以小写字母开头,而类名称以大写字母开头。您可以看到StackOverflow认为OpenGUI是一个类。如果此类之外没有任何东西使用它们(并且它不是常量),则将实例变量设为私有。另外,请注意缩进。

相关问题