2012-02-21 10 views
0

シナリオは次のようなものです。ユーザーがセルを編集し、Tabキーを押します。編集は中止され、値はモデル内にあります。しかし、postUpdateTestFailed()がtrueを返す場合、選択したセルに選択範囲を戻して、ユーザーが何らかの変更を行うことができるようにしたい。問題は、動作しません。私の場合、選択されたセル以外は何も動作します。(ユーザーがTabキーを押すと、フォーカスされた/選択されたセルは常に次のセルになります。 :)TABを押した後、JTableの編集したセルに戻る方法は?

public void tableChanged(TableModelEvent tme) { 
    int row = tme.getFirstRow(); 
    int col = tme.getColumn(); 
    int type = tme.getType(); 
    switch (type) { 
     case TableModelEvent.UPDATE: 
      currentRow = areenTable.convertRowIndexToView(row); 
      currentColumn = areenTable.convertColumnIndexToView(col); 
      if (postUpdateTestFailed()) { 
       // if the test fails, I want to move back to the edited cell 
       areenTable.changeSelection(currentRow, currentColumn, false, false); 
      } 
      break; 

     // the rest of switch 

    } // switch 
} // tableChanged() method 

編集1:私は

編集...誰かが前に同じ問題を経験し、何とかそれを解決することを期待していた2:私は通常、私自身の細胞 - でこれを行うだろうエディタの実装、および検証が失敗した場合のコミットを防ぎます。残念ながら、この特殊なケースでは、私は の後にの変更がコミットされた後にコールしなければなりません...そして、前に編集されたセルにカーソルを置きます。私は他のセルに移動することができますが、最後に編集したものです!私はこれをバグだと考えています。

+1

[SSCCE](http://sscce.org/)をすぐにご利用ください。 –

+0

Andrew、上記の質問に対して誰かがSSCCEを必要としている場合、その人は回答に気を付けるべきではありません。私の質問は無視してください。しかし、私は今それについて編集します。 – DejanLekic

+1

*「誰かがSSCCEを必要とするならば」*誰が私はそれが必要だと言ったのですか? SSCCE *が私に問題をより深く見させることを奨励するだけです。ところで - 答えが必要ですか? –

答えて

2

は十分にちょうど秀奇妙に聞こえた(それを試して抵抗することができませんでしたあなたのリスナーにの前にのテーブルが通知されている、つまり、内部の更新はまだ準備ができていません。仕事、それはテーブルの内部の後に処理されますことを確認するために、invokeLaterにラップすることによって、

@Override 
    public void tableChanged(TableModelEvent tme) { 
     int row = tme.getFirstRow(); 
     int col = tme.getColumn(); 
     int type = tme.getType(); 
     switch (type) { 
      case TableModelEvent.UPDATE: 
       final int currentRow = table.convertRowIndexToView(row); 
       final int currentColumn = table.convertColumnIndexToView(col); 
       if (currentRow == 0) { 
        // if the test fails, I want to move back to the edited cell 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          table.changeSelection(currentRow, currentColumn, false, false); 

         } 
        }); 
       } 
       break; 

      // the rest of switch 

     } // switch 
    } // tableChanged() method 

のようなものところで、私は(彼らはプログラム的に起こるか、変化のような他の理由のために可能性のTableModelの変更のために聞きませんテーブルのエディタまたはeditingRow/Columnプロパティの変更をリッスンします。

+0

ありがとうKleopatra - btw、あなたは他のどのセルにも簡単に移動することができますが、最後に編集したものを気付きましたか? :)私はまだバグとしてそれを見ていますが、私の聴取者がJTableの前に通知されていることは間違いありません。私はそのことを忘れていました... – DejanLekic

+0

そうしない理由はありません:-)そして、それはバグだと思う:内部の更新が完全でない限り、正確な動作は定義されていない – kleopatra

+0

'areenTableのようなものを試してみてください。changeSelection(currentRow、currentColumn-1、false、false); ' - それは動作します、または、' currentColumn + 1'で後のセルです。それはすべて動作しますが、実際に編集されたセルは動作しません。 :) – DejanLekic

2

の後にの編集をコミットしたので、最後に編集したセルに戻る必要があります。代わりに、このexampleに示すように、TableCellEditorの入力でが終了する前に、入力された値を検証します。問題...とええ、でも私は次の時間ので、それを試してみると何が起こっているかを見るために持っている;-)

を -

+0

trashgod、私はあなたが言ったことを認識している。残念ながら、この特殊なケースでは、変更がコミットされた後に 'postUpdateTestFailed()' *を呼び出さなければなりません。そして、カーソルを前に編集したセルに置きます。奇妙なことは、私が*他の細胞*に移動できることです、しかし最後に編集されたものです!私はこれをバグだと考えています。 – DejanLekic

関連する問題