Java JTable转到行错误

Java JTable转到行错误,java,focus,jtable,goto,tablecell,Java,Focus,Jtable,Goto,Tablecell,我有一个find函数,它在一个包含数千个条目的JTable中定位一个字符串。好心的帮我完成了函数的goto部分。但似乎有一个bug 当用户搜索字符串时,应用程序会在JTable中正确找到该行并高亮显示。它也试图专注于此,但并不总是如此。有时它会跳转10+行短的线,我要寻找,我需要向下滚动看到它。正如我所说,这个JTable中有几千个条目,如果我在搜索某个内容,很难滚动是否可以将所选条目聚焦在可见区域的中心? if (logs.get(i).getLine().contains(findStr))

我有一个find函数,它在一个包含数千个条目的JTable中定位一个字符串。好心的帮我完成了函数的goto部分。但似乎有一个bug

当用户搜索字符串时,应用程序会在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;
        }
    }

    ...
}
public类Proto扩展JFrame实现ActionListener
{
公共协议(){…}
@凌驾
已执行的公共无效操作(操作事件)
{
String command=event.getActionCommand();
if(按钮\u下一步\u查找等于(命令))
{
findNext();
}
}
...        
私有void findNext()
{
字符串findStr=findField.getText();
int pos=所选LogRow;
//如果我们再次搜索同一字符串,请向前一步
if(pos==lastFoundPos)
++pos;
//在日志中搜索字符串
而(位置
有时它会跳转10+行短的线,我要寻找,我需要向下滚动看到它

张贴你的文章,说明问题所在。您只需创建一个包含1000行的表,然后使用setValueAt(…)方法用正在搜索的文本填充几个随机单元格

是否可以将所选条目聚焦在可见区域的中心


您需要调整要滚动到的行号。也就是说,如果要向下搜索,则需要从行号中减去“x”,以便视口位于包含文本的行之前的行上。

我没有发布完整的代码,可能需要添加自定义TableModel和CustomRenderOrers。但为了说明问题,该应用程序的一个精简版本发布了整个find函数。除了UI之外,真的没有其他代码了,但是如果您还需要其他东西,请告诉我。@njozwiak,为什么需要包含自定义的TableModel和渲染器?它们是问题的原因吗?创建一个包含1000行的表需要一行代码:newjtable(1000,3);在不同的行上设置一些值还需要几行代码。然后将表格添加到框架中。然后添加搜索按钮和代码。SSCCE应为大约20-30行代码。创建SSCCE是为了证明scrollRectToVisible()的工作方式符合您的预期。您发布的代码没有帮助,因为它不是可执行的。