1

表のセル 0,1 が aaa から XXXX に変更されないのはなぜですか?

import java.awt.*;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;


class MainFrame {

    public static void main(String[] args) {


        JFrame f = new JFrame("Refreshing JTable");
        JPanel p = new JPanel(new GridBagLayout());
        DefaultTableModel productsModel;
        JTable productsTable;

        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        String[] tableTitle = new String[] {"ID", "Name"};
        String[][] tableData = {{"1", "AAA"},{"2", "BBB"}};


        productsModel = new DefaultTableModel(tableData, tableTitle);
        productsTable = new JTable(productsModel) {
            public boolean isCellEditable(int r, int c) {
                return false;
            }
        };

        JScrollPane scrollpane = new JScrollPane(productsTable);


        tableData[0][1] = "XXXX";

        f.add(p);
        p.add(scrollpane);
        f.validate();
        f.setVisible(true);


    }


}

REASON: どうやら、データが格納されている配列を更新しようとすると、JTable が変更されないという結果になります。DefaultTableModel を更新するか、テーブル全体を再描画する必要があります。

EDIT(可能な解決策)1つの方法はTimer を使用することです:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

class MainFrame {

    static JFrame f = new JFrame("Refreshing JTable");
    static JPanel p = new JPanel(new GridBagLayout());
    static DefaultTableModel productsModel;
    static JTable productsTable;

    public static void main(String[] args) {
        runGui();
    }

    @SuppressWarnings("serial")
    public static void runGui() {

        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        String[] tableTitle = new String[] {"ID", "Name"};
        String[][] tableData = {{"1", "AAA"},{"2", "BBB"}};


        productsModel = new DefaultTableModel(tableData, tableTitle);
        productsTable = new JTable(productsModel) {
            public boolean isCellEditable(int r, int c) {
                return false;
            }
        };

        JScrollPane scrollpane = new JScrollPane(productsTable);


        tableData[0][1] = "XXXX";

        Timer t = new Timer(2000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                addColumns();
                remakeData();
                productsTable.setModel(productsModel);

            }
        });
        t.start();

        f.add(p);
        p.add(scrollpane);
        f.validate();
        f.setVisible(true);


    }

    private static void addColumns() {
        productsModel.setColumnCount(0);
        productsModel.addColumn("ID");
        productsModel.addColumn("Name");
    }

    private static void remakeData() {
        productsModel.setRowCount(0);
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"1", "Dummy item 1"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"2", "Dummy itme 2"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"3", "Dummy item 3"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"4", "Dummy item 4"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"5", "Dummy item 5"});
    }
}

EDIT(はるかに優れたソリューション、完璧に機能する方法)静的メソッドを使用します。別のフレームを介して配列に新しいデータを追加しているので、配列にオブジェクトを追加/更新/削除するたびに呼び出す静的メソッドをメインフレームに作成しました。このメソッドは、更新後にモデル全体をやり直すため、テーブルを更新します。

4

2 に答える 2

3

関連するスレッドに投稿された SSCCE の問題の 1 つは、コードがテーブル モデルを最初に形成した配列を変更するのに対して、テーブル モデル自体を変更する必要があることです。

于 2012-03-21T07:35:25.487 に答える
3

あなたの問題(および前の問題)の解決策はかなり単純ですが、残念ながらコメントに投稿するには少し長すぎます

  1. JTableが実際にどのように機能するかを必ず読んでください。良い出発点は、Swing チュートリアルであり、おそらく最も重要なクラスJTableTableModel. Swing と MVC の使用に関するもう 1 つの良い読み物は、このドキュメントです。これは s だけよりもはるかに広いJTableですが、すべての Swing コンポーネントがどのように設計されているか、およびそれらをどのように使用すべきかについて、より多くの洞察を提供します。
  2. そのチュートリアルを読んだ後、テーブルに表示されているデータを更新したい場合は、テーブルのモデルを更新することを理解する必要があります。モデルは、テーブルが受信したイベントを発生させ、テーブルは自分自身を更新することを確認します。結局のところ、テーブルはデータ (=the TableModel) のビューにすぎないため、テイクの更新はモデル側で行う必要があります。これが明確でない場合は、手順 1 に戻ります
  3. コードを見て、リスナーを削除してください。代わりに、テーブルのモデルを更新し、テーブル自体がどのように更新されるかを確認してください。
  4. これが機能しない場合は、投稿したSSCCEを使用してこのサイトに戻ってきます。そうすれば、あなたが何かを試したこと、何を試したのか、コードのどこが間違っている可能性が高いのかがわかります。この SSCCE には、使用している のコードと、問題が発生する可能性が最も高い場所であるため、TableModelを更新するコードが含まれている必要があります。TableModel
于 2012-03-20T21:33:01.870 に答える