0

私のフォームには、TableModelListenerを備えたJTableがあります。tableChangedメソッドは、JButtonのロジックを更新します。これはすべて正しく機能します。ユーザーがjtableのセルの値を編集すると、tableChangedメソッドが実行され、それに応じてボタンが更新されます。

私が抱えている問題はショーストッパーです。JTableは、オブジェクトとオブジェクトのいくつかの属性を表示します。ユーザーは、アプリケーションからオブジェクトを選択します。
オブジェクトが選択され、jtableに表示されている場合。そのユーザーがアプリケーションで属性値を変更し、JTableで編集しない場合。jtableは引き続き更新され、変更された値が表示されます。しかし、TableModelEventは実行されておらず、ボタンロジックは更新されません。

TableCellListenersを見てきましたが、それでもテーブルの編集を探しています。だから私はそれがここでうまくいくとは思わない。

jtable自体でイベントが発生せずに、何かが変更され、テーブルが更新されたことをどのように確認できますか?

編集:jtableコードの一部を配置する

これは私の基本ダイアログクラスにあります

selectTable = new JTable(SingletonSelectTable.getInstance());
selectTable.getModel().addTableModelListener(this); 
selectTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        Font font = comp.getFont();
        if (SingletonSelectTable.getInstance().isCellBold(row, column) == true){
           comp.setFont(font.deriveFont(Font.BOLD));
        }
     return comp;
     }
  });

selectTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
selectTable.setCellSelectionEnabled(false);
selectTable.setRowSelectionAllowed(true);
selectTable.setColumnSelectionAllowed(false);
JScrollPane ScrollPane = new JScrollPane(selectTable);

tableChangedメソッド

public void tableChanged(TableModelEvent e) {
  setRemoveButtonVisibility();
  setRemoveAllButtonVisibility();
  setCommentButtonVisibility();
  setOKButtonEnabledStatus();

}

私のシングルトンクラス

public class SingletonSelectTable extends AbstractTableModel {

これがお役に立てば幸いです

4

1 に答える 1

3

jtable自体でイベントが発生せずに、何かが変更され、テーブルが更新されたことをどのように確認できますか?

にイベントはありませんJTableTableModel変化するのは根底にありTableModel、イベントを発生させるのはそれです。はJTableリスナーをに登録するTableModelので、表示されたテーブルの内容をいつ更新する必要があるかがわかります。

したがって、getsが更新されると言っている場合JTable(自動的に、スクロール/選択/ホバー/ ...を使用せずに)TableModel、がイベントを発生させることを意味します。つまり、イベントをリッスンすることもできます。

アプリケーションで要素が変更されたシナリオでは、からTableModel何かが起動する必要があります。通常、これは、オブジェクトに含まれるオブジェクトの変更をリッスンさせるか、オブジェクトを変更するコードに、基になるデータが変更されたことを通知させることによって行われます。いずれにせよ、イベントを発生させる必要があるため、単に発生しない(つまり、正しくない)場合を除いて、リスナーがイベントを受信しない理由はありません。TableModelEventTableModelTableModelTableModelTableModelTableModel

あなたのコメントに基づく私の最善の推測は、あなたはあなたの実装が正しくなくTableModel、あなたTableModelは単にイベントを発生させず、そしてはJTable「偶然に」更新されるということです(私の経験ではJTable、確かに行方不明のイベントに対してかなり堅牢です行が追加/削除されていない場合...明確に)と比較されJTreeます

getValueAt()メソッドは変更を取得してから、jtableを更新します

これは本当に間違っているように聞こえます。getValueAt()メソッドは通常、イベントを受信した後にによって呼び出されますJTable。イベントのおかげでJTable、モデルに新しいデータを照会するために更新する必要があることがわかります。したがって、getValueAtメソッドは変更を取得しませんが、変更の結果として呼び出されます。

Swingテーブルのチュートリアル、およびテーブルモデルの作成、データ変更のリッスン、データ変更イベントの起動に関するセクションを確認することを強くお勧めします。

于 2012-07-18T21:11:51.353 に答える