我有一个find函数,它在一个JTable中找到一个包含数千个条目的字符串。 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行,在完整版中并非总是如此。
即使是这个演示的代码仍然是几百行,所以下面是我认为相关的部分。
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 :(得分:0)
有时候它会跳出超过我想要的线的10多行,我需要向下滚动才能看到它。
发布展示问题的SSCCE。您可以创建一个包含一千行的表,然后使用setValueAt(...)方法使用您要搜索的文本填充一些随机单元格。
是否可以将所选条目聚焦在可见区域的中心?
您需要调整要滚动到的行号。也就是说,如果您正在搜索,则需要从行号中减去“x”,以便视口位于包含文本的行之前的行上。