2012-12-28 101 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