-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

2 回答 2

4

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

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

DefaultTableModel model=new DefaultTableModel(data,columns);

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

model.removeRow(table.getSelectedRow());

从这个新的表模型中删除一行。为什么要修改新模型而不是修改现有模型?

        table.setModel(model);

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

        table.setModel(aut1);

用旧型号替换新型号。为什么?

        panel.add(table);

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

您应该deleteRow()在 AbstractTableModel 中实现一个方法。

使用对象列表(每行代表一行)也比使用单个列表表示所有行要清晰得多。

我感觉您在复制和粘贴代码时完全不了解它是如何工作的以及 Swing 的架构是什么。阅读 Swing 教程。甚至在此之前,阅读一本关于 Java、变量和范围的介绍性书籍。

于 2012-12-28T22:51:03.497 回答
2

首先,您永远不会aut1在按钮操作之前将表格模型 ( ) 设置为表格。

其次,当您在操作处理程序中构造新数据时,我看不到数据和columns定义的位置DefaultTableModel- 您尝试从这个“新”表模型中删除一行并将其应用于表,然后替换为 with aut1,这有效地做了....什么也没做。

在构建你的 UI 时,不要忘记将表格模型设置为表格...table.setModel(aut1)

DefaultTableModel从动作处理程序中删除并改用aut1

更新了建议

  • 你应该避免在方法中构建你的 UI static main,而是使用一个类实例,它会让你的代码更清晰,并且将来会出现更少的问题
  • 您应该只在事件调度线程的上下文中构造/操作 UI/Swing 组件,使用EventQueue#invokeLater
于 2012-12-28T22:48:49.367 回答