2017-09-12 15 views
0

jtableセルリスナーの理解に役立つ助けが必要です。JTableセルリスナーJAVA

私の問題は、セルに変更をキャッチする必要があることです。キャッチすると古い値と新しい値を取得する必要があります。

私が求めている理由は、私がDefaultTableModelでJTableを使用しているということです。

私はこれについての他の記事を見ましたが、実装しようとしているときに "String"の結果は得られません。ここで

は、私が使用しているものです:

 table.addPropertyChangeListener(new PropertyChangeListener() { 

     @Override 
     public void propertyChange(PropertyChangeEvent evt) { 

      System.out.println(evt.getOldValue()); 
      System.out.println(evt.getNewValue()); 
     } 

    }); 

これは私が得るものです:

null 
[email protected] 
[email protected] 
null 
null 
[email protected] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=0,g=0,b=0] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=9,g=80,b=208] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=202,g=202,b=202] 
null 
false 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=0,g=0,b=0] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=202,g=202,b=202] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=9,g=80,b=208] 
false 
true 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=0,g=0,b=0] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=9,g=80,b=208] 
com.apple.laf.AquaImageFactory$SystemColorProxy[r=202,g=202,b=202] 
true 
false 
+1

あなたが本当にすべきことは、 'DefaultTableModel'の' setValueAt'メソッドをオーバーライドすることです。これは、値が変更されたことを通知し、新しい値と古い値の両方にアクセスできるようにします。あなたは 'TableModelListener'を使ってみることができますが、新しい値を得るには – MadProgrammer

+0

@MadProgrammer何を意味するのですか?オーバーライドアノテーションを使用して独自のメソッドを作成するには? – Ervinas34

+0

...あなたは基本的なOOを理解していますか? 'DefaultTableModel'は' setValueAt'と呼ばれる 'TableModel'を介して移植された' AbstractTableModel'から継承されたメソッドを持っています。これは、あるパーティーがあるセルで値を変更したいときに呼び出されます。これは、古い値と新しい値の両方を取得するための唯一の(妥当な)場所です。 – MadProgrammer

答えて

1

二つのアプローチ。

最初にTableModelをカスタマイズし、setValueAt(...)メソッドを上書きします。基本的なコードは次のようになります。

@Override 
public void setValueAt(Object newValue, int row, int column) 
{ 
    Object oldValue = getValueAt(row, column); 

    // do processing with your "oldValue" and the "newValue" 

    super.setValueAt(...); 
} 

他のアプローチは、あなたがどのTableModelに追加できる「リスナー」を使用することです。この方法では、Table Cell Listenerを使用できます。このクラスは、oldValue/newValueが変更されるたびにイベントを生成します。このイベントは両方の値にアクセスできるようになりますので、処理を行うことができます。

厳密な要件に応じて、いずれのアプローチを使用することもできます。