2012-12-28 65 views
-2

我的整个代码是这样的,但我的代码有一个错误,没有运行: 从文件读取是正确的,但没有删除行。行删除表

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); 
} 
} 

请修复我的代码!

回答

4

这段代码不能编译。您正在从静态方法(main)引用实例字段(datacolumns)。编译器的错误消息应该告诉你。如果您不明白,请使用Google搜索错误消息来引导您解释错误消息。

即使它没有编译器,这里的事件侦听器的每一行的解释:

DefaultTableModel model=new DefaultTableModel(data,columns); 

创建一个新的表格模型。为什么?你的桌子已经有一个。您所需要的只是修改现有的表格模型

model.removeRow(table.getSelectedRow()); 

从此新表格模型中移除一行。为什么修改一个新模型而不是修改现有模型?

 table.setModel(model); 

将旧模型换成新模型。这是非常低效的。该表已经有一个模型。修改它。

 table.setModel(aut1); 

将新模型替换为旧模型。为什么?

 panel.add(table); 

将表格添加到框架的主面板。为什么?桌子已经在那里并且可见。这没有意义。

您应该在AbstractTableModel中实施deleteRow()方法。

使用对象列表(其中每行表示一行)也比使用单个列表来表示所有行更清晰。

我有这样的感觉,即你在复制和粘贴代码时完全不了解它是如何工作的以及Swing的体系结构是什么。阅读Swing教程。甚至在此之前,请阅读关于Java,变量和范围的介绍性书籍。

+0

谢谢你,你喜欢特别的书吗? – Sajad

+0

不,我在很多年前就学到了这一切,现在我使用教程和javadoc作为主要的信息来源。 –

+0

非常感谢你! – Sajad

2

首先,您从未将表模型(aut1)设置为按钮操作前的表格。其次,在您的动作处理程序中构造新的DefaultTableModel时,我看不到数据和columns的位置 - 您尝试从该“新”表模型中删除一行并将其应用于该表以及然后替换为aut1,这有效地完成了....没有任何东西。

在构建你的UI,不要忘了表模型设置表... table.setModel(aut1)

从操作处理程序删除DefaultTableModel和使用aut1代替。

更新与建议

  • 你应该避免在static main方法构建你的UI,而是使用一个类的实例,相反,它会使你的代码更干净,会出现较少的问题纳入未来
  • 您只能从事件调度线程的上下文中构建/操作UI/Swing组件,请使用EventQueue#invokeLater