问题:
当按下保存按钮时,我想将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);
}
}
答案 0 :(得分:1)
您可以采取一些措施来简化此代码(并遵循Java惯例):
创建保存数据的JTable
并显示实例变量。 不创建新的JTable
。内部类可以访问外部类变量的任何,因此您可以(并且应该)将实例变量设置为私有。
摆脱外部类中的getTableData
方法。你不需要那样。
让getTableData
方法返回String[][]
而不是Object[][]
。您在方法中使用了String[][]
,并且您没有通过返回Object[][]
来帮助您。
触发actionPerformed
方法时,使用内部类中的getTableData
方法通过外部类中的实例变量获取JTable
中的数据。 / p>
为类名和方法名使用适当的大小写。方法名称以小写字母开头,而类名称以大写字母开头。您可以看到StackOverflow认为OpenGUI
是一个类。如果此类之外没有任何东西使用它们(并且它不是常量),则将实例变量设为私有。另外,请注意缩进。