-2

私のコード全体はこれですが、私のコードには1つのエラーがあり、実行されません。ファイルからの読み取りは正しく行われますが、行を削除しないでください。

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

新しいテーブルモデルを作成します。なんで?あなたのテーブルにはすでに1つあります。必要なのは、既存のテーブルモデルを変更することだけです

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次に、アクションハンドラーでnewを作成するときに、データと定義がどこにあるかわかりません。DefaultTableModelこの「新しい」テーブルモデルから行を削除し、それをテーブルに適用してから、に置き換えますaut1。効果的に行った....何も。

UIを構築するときは、テーブルモデルをテーブルに設定することを忘れないでください...table.setModel(aut1)

DefaultTableModelアクションハンドラからを削除し、aut1代わりに使用してください。

提案で更新

  • メソッドでUIを構築することは避けstatic main、代わりにクラスインスタンスを使用する必要があります。これにより、コードがよりクリーンになり、将来の問題が少なくなります。
  • イベントディスパッチスレッドのコンテキスト内からのみUI/Swingコンポーネントを構築/操作する必要があります。EventQueue#invokeLater
于 2012-12-28T22:48:49.367 に答える