У меня есть функция поиска, которая находит строку в 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;
}
}
...
}