2011-01-08 7 views
1

私は数千のエントリを持つJTableの文字列を見つけるfind関数を持っています。 Michael Meyersは、関数のgoto部分で私を助けるほど親切でした。しかし、バグがあるようです...Java JTable Goto Rowバグ

ユーザーが文字列を検索すると、アプリケーションはJTable内の行を正しく見つけてハイライト表示します。それにも焦点を当てようとしますが、必ずしもそうとは限りません。時にはそれは私が探しているラインの短い10 +ラインをジャンプし、私はそれを見るためにスクロールする必要があります。私が言ったように、このJTableには数千ものエントリーがあり、私が何かを探していると、スクロールするのが難しいです。 選択した項目を表示領域の中心に合わせることはできますか?

if (logs.get(i).getLine().contains(findStr)) 
{ 
    logTable.scrollRectToVisible(logTable.getCellRect(thisPos, 1, true)); // goto 
    logTable.setRowSelectionInterval(thisPos, thisPos);      // highlight 
} 

私はそれがすべてのに役立ちますが、ここではJTableのセットアップコードであることはよく分からない:

JTable logTable = new JTable(logTableModel); 
logTable.setShowGrid(true); 
logTable.setShowVerticalLines(true); 
logTable.setShowHorizontalLines(false); 
logTable.setRowSorter(sorter); 
logTable.getSelectionModel().addListSelectionListener(new LogRowListener()); 

JScrollPane scrollPane = new JScrollPane(); 
scrollPane.getViewport().add(logTable); 
scrollPane.setPreferredSize(new Dimension(800, 450)); 
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

おかげ

以下EDITは、ダウンロードするためのリンクです。 jarファイル。このファイルは、問題を示すコードの限定されたバージョンです。このバージョンは一貫して2-3行短くジャンプしているようですが、フルバージョンではそうではありません。

Demo.jar

も、このデモのコードはまだ数百行であるので、以下、私は関連があると考えている節があります。

public class Proto extends JFrame implements ActionListener 
{ 
    public Proto() { ... } 

    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
     String command = event.getActionCommand(); 

     if (BUTTON_NEXT_FIND.equals(command)) 
     { 
      findNext(); 
     } 
    } 

    ...   

    private void findNext() 
    { 
     String findStr = findField.getText(); 

     int pos = selectedLogRow; 

     // if we're searching for the same string again step forward once 
     if (pos == lastFoundPos) 
      ++pos; 

     // search through the log for the string 
     while (pos < logs.size()) 
     { 
      if (logs.get(pos).getLine().contains(findStr)) 
      { 
       logTable.scrollRectToVisible(logTable.getCellRect(pos, 1, true)); 
       logTable.setRowSelectionInterval(pos, pos); 
       lastFoundPos = pos; 
       break;  
      } 
      ++pos; 
     } 
    } 

    ... 
} 

答えて

0

時にはそれは私が探していますラインの短い10+ラインをジャンプしますし、私はそれを表示するには、スクロールダウンする必要があります。

あなたの問題を示すSSCCEを投稿してください。 1000行のテーブルを作成してから、setValueAt(...)メソッドを使用して、検索するテキストをいくつかのランダムなセルに設定することができます。

選択した項目を表示領域の中央に合わせることはできますか?

スクロール先の行番号を調整する必要があります。つまり、行番号から "x"を引く必要がある場合は、ビューポートがテキストを含む行の前の行の位置になるように検索しています。

+0

コード全体を投稿していないので、カスタムTableModelとCustomRendorersを追加する必要があります。しかし、アプリケーションを整理して問題を説明し、find関数全体をポストしました。 UIのもの以外のコードは本当にありませんが、他にも必要なものがあれば教えてください。 – linsek

+0

@njozwiak、カスタムTableModelとレンダラーを組み込む必要があるのはなぜですか?彼らは問題の原因ですか? 1000行のテーブルを作成するには、1行のコードが必要です。new JTable(1000、3);さまざまな行にいくつかの値を設定するために、さらに2行のコード行が必要です。次に、テーブルをフレームに追加します。次に、検索ボタンとコードを追加します。 SSCCEは、約20〜30行のコードでなければなりません。あなたは、scrollRectToVisible()が期待通りに動作するという概念の証明のためにSSCCEを作成します。あなたが掲示したコードは実行可能ではないので助けにならない。 – camickr