1

テーブルを更新しようとしていますが、うまくいきません。テーブルは、それを呼び出すプログラム全体が完了するまで表示されません。どうすればこれを変更できますか? ウィンドウを開いたときに、データを入力したいと思いJTableます。コードの実行を停止すると、テーブルはデータでいっぱいになります。糸は必要ですか?どうすれば正しく使用できますか?私のコードは以下です。

public class TestGUI extends DefaultTableCellRenderer implements TeststepEventListener {

    public JFrame frame;
    private JTable testcase_table;
    private JTable teststep_table;

    /**
     * Create the application.
     */
    public TestGUI() {
        initialize();
        frame.setVisible(true);
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JProgressBar progressBar = new JProgressBar();
        progressBar.setBounds(50, 68, 700, 14);
        frame.getContentPane().add(progressBar);

        JTextPane txtpnAutomotiveHmi = new JTextPane();
        txtpnAutomotiveHmi.setText("Automotive HMI");
        txtpnAutomotiveHmi.setBounds(362, 21, 205, 20);
        frame.getContentPane().add(txtpnAutomotiveHmi);

        testcase_table = new JTable();
        testcase_table.setBounds(50, 125, 350, 426);
        frame.getContentPane().add(testcase_table);

        teststep_table = new JTable();
        teststep_table.setBounds(399, 125, 350, 426);
        frame.getContentPane().add(teststep_table);
    }
    private boolean testcase = true;

    @Override
    public void myEventOccurred(TeststepEvent event) {
        TeststepData data = event.data();
        if (testcase) {
            set_values(data.getDoc(), data.getTestcase());
        }
        testcase = false;

    }
    private int i = 0;
    LinkedList names = new LinkedList();

    private void set_values(Document doc, int testcase) {
        frame.setTitle("Wuratbrot" + i);
        i++;
        Element element = doc.getRootElement();
        names.clear();
        if (element != null) {
            List<Element> testCases = element.getChildren();
            //testcase_table.removeAll();
            //String[] title = {"Testcases"};


            for (Element testCase : testCases) {
                names.add(testCase.getAttributeValue("name"));
            }

            DisplayData(names);
        }

        testcase_table.revalidate();
        frame.validate();
    }

    private void DisplayData(List<String> Testcases) {

        DefaultTableModel aModel = new DefaultTableModel() {
            //setting the jtable read only
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        //setting the column name
        Object[] tableColumnNames = new Object[1];
        tableColumnNames[0] = "TestCases";


        aModel.setColumnIdentifiers(tableColumnNames);
        if (Testcases == null) {

            testcase_table.setModel(aModel);

            return;
        }

        Object[] objects = new Object[1];
        ListIterator<String> lstrg = Testcases.listIterator();
        //populating the tablemodel
        while (lstrg.hasNext()) {
            String newcus = lstrg.next();
            objects[0] = newcus;


            aModel.addRow(objects);
        }

        //binding the jtable to the model
        testcase_table.setModel(aModel);
    }
}
4

2 に答える 2

1

SwingWorkerこれを目的としています。データ取得は で非同期に実行できますが、を介してイベント ディスパッチ スレッドでdoInBackground()process()安全に更新します。特に、サンプルの使用法とこのチュートリアルというタイトルのセクションを参照してください。さらに、がリッスンする適切な更新イベントを発生させます。追加のコードは必要ありません。余談ですが、ではなくレイアウトを使用してください。TableModelpublish()DefaultTableModelJTablesetBounds()

于 2013-06-04T17:13:30.340 に答える
0

関数が必要ですfireTableDataChanged。テーブル セルの値を変更した後、テーブル モデルで呼び出す必要があります。

于 2013-06-04T16:17:51.583 に答える