Java JTable Goto Row Bug - PullRequest
       11

Java JTable Goto Row Bug

1 голос
/ 08 января 2011

У меня есть функция поиска, которая находит строку в JTable с несколькими тысячами записей. Майкл Мейерс был достаточно любезен, чтобы помочь мне с переходной частью функции. Кажется, есть ошибка ...

Когда пользователь ищет строку, приложение правильно находит строку в 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;
        }
    }

    ...
}

1 Ответ

0 голосов
/ 08 января 2011

Иногда он будет прыгать на 10+ строк меньше строки, которую я ищу, и мне нужно прокрутить вниз, чтобы увидеть ее.

Опубликовать SSCCE демонстрирует проблему.Вы можете просто создать таблицу с тысячей строк, а затем использовать метод setValueAt (...), чтобы заполнить несколько случайных ячеек искомым текстом.

Можно ли сфокусировать выделенноезапись в центре видимой области?

Вам необходимо настроить номер строки, на которую вы хотите перейти.То есть, если вы ищете вниз, вам нужно будет вычесть "x" из номера строки, чтобы область просмотра находилась в строке перед строкой, содержащей текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...