0

JTable を使用するアプリケーションがあります。データベースに何かを追加するとデータベースに入りますが、どうにかして JTable を再作成できません.. repaint(); を試みました。テーブルを作成するメソッドは、Revalidate(); を試しました。しかし成功しない

メソッドを思い出そうとしましたが、それも役に立ちませんでした。

実行されるアクションは次のとおりです。

    @Override
public void actionPerformed(ActionEvent e) {

    if(e.getSource() == add) {
        model.insertValue(toDo.getText());
        model.getValue();
        view.createTable();
        toDo.setText("");
    }
}

JTable を作成するメソッド

    public void createTable() {

    JTable table = new JTable();

    DefaultTableModel tableModel = new DefaultTableModel(new Object[][]{},new String[]{"To do","Date added", "Modify"});

    table.setSize(450, 600);


    table.setModel(tableModel);
    JScrollPane scrlPan=new JScrollPane(table);

    for(int i = 0; i < model.getId().size(); i++) {

        tableModel.addRow(new Object[]{
                model.getItem().get(i), 
                model.getDate().get(i), 
                model.getId().get(i)
                });
    }

    add(scrlPan);
    add(table.getTableHeader(), BorderLayout.NORTH);
    add(table, BorderLayout.CENTER);
}

これを解決する方法についてのアイデアはありますか?

4

3 に答える 3

1

クラスtableModelのフィールドとして作成し、必要に応じて更新します。tableオブジェクトを再作成しないでください。

于 2013-01-09T13:21:15.467 に答える
1

次のコードは、あなたのコードから直接派生したもので、問題なく機能します。

    JTable table = new JTable();
    final DefaultTableModel model = new DefaultTableModel(
            new Object[][] {}, new String[] { "To do", "Date added",
                    "Modify" });
    table.setModel(model);

    JFrame f = new JFrame();
    f.getContentPane().add(table);

    JButton b = new JButton("More ..");
    f.getContentPane().add(b, BorderLayout.NORTH);
    b.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < 2; i++) {
                model.addRow(new Object[] { "A" + i, "B" + i, "C" + i });
            }
        }
    });
    f.setSize(400, 400);
    f.setVisible(true);
    b.doClick();

単にあなたが違ったやり方をしていることを確認してください。最後に疑うかもしれませんが、Swing以外のスレッドから直接新しい値を設定するかもしれません。SwingUtilities.invokeLaterを使用して値を設定します。

AbstractTableModelから派生したモデルは、モデルで継承されたメソッドfireTableCellUpdatedを呼び出す必要があります。また、JTableが登録するコンテンツ変更リスナーを起動するトリガーがさらにあるため、モデルが変更されたときに自身を更新できます。あなたのケースに適したものを使用してください。コンテンツ全体を変更するのに適した別の方法は、まったく新しいTableModelを作成して設定することです。ただし、あなたの場合、DefaultTableModelを使用するため、これは関係がない可能性があります。この機能はすでに実装されており、repaint()、revalidate()、fireTableXYZは必要ありません。新しいコンテンツを設定するとすぐに、すべてを実行する必要があります。

于 2013-01-09T13:23:06.053 に答える
1
  • 車輪を再発明しないくださいResultSetTableModel (few code workarounds)@camickr

  • 回避策はEDT sensitiveJTablesコンテンツResultSetがすべての行を返すまで待機するか、フリーズするか、長くてハード (JDBC) が完了するまで責任を負わSwing GUIないことです。)Key & Mouse eventsObjectResultSetssmall DB tablesConnection to DatabaseSwingWorkerBatch logicsXxxTableModel with 20rows

于 2013-01-09T13:33:49.977 に答える