我的整个代码是这样的,但是我的代码有一个错误而没有运行: 从文件中读取是正确的,但不要删除行。
public class AllUserTable extends AbstractTableModel{
Vector data;
Vector columns;
public AllUserTable() {
String line;
data = new Vector();
columns = new Vector();
try {
FileInputStream fis = new FileInputStream("D:\\AllUserRecords.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
while (st1.hasMoreTokens())
columns.addElement(st1.nextToken());
while ((line = br.readLine()) != null) {
StringTokenizer st2 = new StringTokenizer(line, " ");
while (st2.hasMoreTokens())
data.addElement(st2.nextToken());
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public int getRowCount() {
return data.size() / getColumnCount();
}
public int getColumnCount() {
return columns.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
return (String) data.elementAt((rowIndex * getColumnCount())
+ columnIndex);
}
public static void main(String[] args){
final AllUserTable aut1=new AllUserTable();
final JFrame frame1=new JFrame();
final JTable table=new JTable();
final JPanel panel=new JPanel();
JButton button1=new JButton("Delete");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DefaultTableModel model=new DefaultTableModel(data,columns); //Error!
model.removeRow(table.getSelectedRow());
table.setModel(model);
table.setModel(aut1);
panel.add(table);
}
});
JScrollPane scroolpane=new JScrollPane();
scroolpane.setViewportView(table);
panel.add(scroolpane);
panel.add(button1);
frame1.add(panel);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setBounds(200, 80, 600, 500);
frame1.setVisible(true);
}
}
请修复我的代码!
答案 0 :(得分:4)
此代码无法编译。您正在从静态方法(main)引用实例字段(data
,columns
)。编译器的错误消息应告诉您。如果你不理解它,谷歌搜索错误信息应该会引导你解释错误信息。
即使它做了编译器,这里也是对事件监听器每一行的解释:
DefaultTableModel model=new DefaultTableModel(data,columns);
创建一个新的表模型。为什么?你的餐桌已有。您只需要修改现有的表模型
model.removeRow(table.getSelectedRow());
从此新表模型中删除一行。为什么要修改新模型而不是修改现有模型?
table.setModel(model);
用新的模型替换旧模型。这是非常低效的。该表已有一个模型。修改它。
table.setModel(aut1);
用旧版本替换新模型。为什么呢?
panel.add(table);
将表格添加到框架的主面板中。为什么?该表已经存在且可见。这毫无意义。
您应该在AbstractTableModel中实现deleteRow()
方法。
使用对象列表,其中每行代表一行,也比使用单个列表代表所有行更清晰。
我觉得你在复制和粘贴代码时根本不了解它是如何工作的以及Swing的架构是什么。阅读Swing教程。甚至在此之前,请阅读有关Java,变量和范围的介绍性书籍。
答案 1 :(得分:2)
首先,在按钮操作之前,你永远不会将表格模型(aut1
)设置到表格。
其次,当你在动作处理程序中构造新的columns
时,我没有看到数据和DefaultTableModel
的定义 - 你尝试从这个“新”表模型中删除一行并且将它应用到表中,然后替换为aut1
,这实际上已经完成......没有。
构建用户界面时,不要忘记将表格模型设置为表格... table.setModel(aut1)
从操作处理程序中删除DefaultTableModel
,然后使用aut1
。
更新了建议
static main
方法中构建你的UI,而是使用类实例,它会使你的代码更清晰,并且将来会出现更少的问题EventQueue#invokeLater