1

2 つの別個のコンポーネントがあります。1 つは拡張するクラスで、もう 1 つは拡張する (フォームを含む)JTableクラスです。JPanel

そのアプリケーションの実行時に両方が同じビューに表示されます。テーブルの行をクリックすると、フォームのテキストファイルが更新されると予想されますが、何も起こりませんオブザーバー (フォームクラスはリスナー) パターンを使用して送信しますクリックされた行を、更新するフォーム フィールドを含むクラス/パネルに移動すると、値は受信されますが、テキスト フィールドは更新されません。

以下のコードはフォーム クラスにあり、フォーム フィールドを更新します。フォーム クラスはテーブル クラスのリスナーとして追加され、テーブルの行がクリックされると以下のメソッドが起動されます。

public void onTableRowClick(CollectedParcelEvent e)
{
     JOptionPane.showMessageDialog(null,"test", "test", 1);

    txtCost.setText(Double.toString(e.getSource().getCost()));
    txtCustomerName.setText(e.getSource().getCustomer().getName());


    txtCost.repaint();
    txtCost.revalidate();

}
4

2 に答える 2

1
public void onTableRowClick(CollectedParcelEvent e)
{
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            //JOptionPane.showMessageDialog(null,"test", "test", 1);
            txtCost.setText(Double.toString(e.getSource().getCost()));
            txtCustomerName.setText(e.getSource().getCustomer().getName());
        }
    });
}

イベントは、単一のイベント スレッドで処理されます。そこでは、GUI は他のイベントに応答しません。そのようなことは、後でinvokeLaterを使用して延期する必要があります。

于 2013-03-28T17:53:09.987 に答える
0

revalidate();新しく追加または削除されたコンポーネント リストに基づいてレイアウト マネージャーにリセットするように指示するだけなので、なぜ呼び出しているのかわかりません。

使用revalidate();に関するその他の回答については、このリンクを参照してください。

そしておそらく、repaint();必要な変更には十分なはずです。

したがって、メソッドをチェックして、実際に起動されるかどうかを確認してください。

于 2013-03-28T17:50:25.917 に答える