行删除表

时间:2012-12-28 22:37:11

标签: java swing jtable

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

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

请修复我的代码!

2 个答案:

答案 0 :(得分:4)

此代码无法编译。您正在从静态方法(main)引用实例字段(datacolumns)。编译器的错误消息应告诉您。如果你不理解它,谷歌搜索错误信息应该会引导你解释错误信息。

即使它做了编译器,这里也是对事件监听器每一行的解释:

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,而是使用类实例,它会使你的代码更清晰,并且将来会出现更少的问题
  • 您应该只在Event Dispatching Thread的上下文中构造/操作UI / Swing组件,使用EventQueue#invokeLater