私は数千のエントリを持つ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行短くジャンプしているようですが、フルバージョンではそうではありません。
も、このデモのコードはまだ数百行であるので、以下、私は関連があると考えている節があります。
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;
}
}
...
}
コード全体を投稿していないので、カスタムTableModelとCustomRendorersを追加する必要があります。しかし、アプリケーションを整理して問題を説明し、find関数全体をポストしました。 UIのもの以外のコードは本当にありませんが、他にも必要なものがあれば教えてください。 – linsek
@njozwiak、カスタムTableModelとレンダラーを組み込む必要があるのはなぜですか?彼らは問題の原因ですか? 1000行のテーブルを作成するには、1行のコードが必要です。new JTable(1000、3);さまざまな行にいくつかの値を設定するために、さらに2行のコード行が必要です。次に、テーブルをフレームに追加します。次に、検索ボタンとコードを追加します。 SSCCEは、約20〜30行のコードでなければなりません。あなたは、scrollRectToVisible()が期待通りに動作するという概念の証明のためにSSCCEを作成します。あなたが掲示したコードは実行可能ではないので助けにならない。 – camickr