1

かなりの数のエントリを持つJTable内の文字列を検索するfind関数があります。Michael Meyersは親切にも、関数のgoto部分を手伝ってくれました。バグがあるようですが...

ユーザーが文字列を検索すると、アプリケーションは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);

ありがとう

編集 以下は、.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;
        }
    }

    ...
}
4

1 に答える 1

0

探している行よりも 10 行以上短くジャンプすることがあり、下にスクロールして表示する必要があります。

問題を示すSSCCEを投稿してください。1,000 行のテーブルを作成し、setValueAt(...) メソッドを使用して、検索対象のテキストをいくつかのランダム セルに入力するだけです。

選択したエントリを表示領域の中央にフォーカスすることはできますか?

スクロールしたい行番号を調整する必要があります。つまり、下方向に検索する場合は、行番号から「x」を引く必要があるため、テキストを含む行の前の行にビューポートが配置されます。

于 2011-01-08T06:59:36.727 に答える