有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用JTextfield文本重复搜索JTable

下面的代码将从文本字段中获取文本,并在JTable中搜索它。它只显示文本的第一次出现。我也需要连续发生。所以,请指导我如何实现这一点。提前谢谢

private void search8()
{
    String target8 = sear8.getText();
    for(int row = 0; row < table8.getRowCount(); row++)
        for(int col = 0; col < table8.getColumnCount(); col++)
        {
            String next8 = (String)table8.getValueAt(row, col);
            if(next8.equals(target8))
            {
                showSearchResults(row, col);
                return;
            }
        }
}

更新:

private void showSearchResults(int row, int col)
{
    CustomRenderer renderer = (CustomRenderer)table8.getCellRenderer(row, col);
    renderer.setTargetCell(row, col);
    Rectangle r8 = table8.getCellRect(row, col, false);
    table8.scrollRectToVisible(r8);
    table8.repaint();
}

class CustomRenderer implements TableCellRenderer
{
    public CustomRenderer()
    {
       label = new JLabel();
       label.setHorizontalAlignment(JLabel.CENTER);
       label.setOpaque(true);
       targetRow = -1;
       targetCol = -1;
    }

    public Component getTableCellRendererComponent(JTable table,
    Object value,boolean isSelected,boolean hasFocus,int row, int column)
    {
       if(isSelected)
       {
           label.setBackground(table.getSelectionBackground());
           label.setForeground(table.getSelectionForeground());
       }
       else
       {
           label.setBackground(table.getBackground());
           label.setForeground(table.getForeground());
       }
       if(row == targetRow && column == targetCol)
       {
           label.setBackground(new Color(176,196,222));
           //label.setBorder(BorderFactory.createLineBorder(Color.red));
           label.setFont(table.getFont().deriveFont(Font.BOLD));
       }
       else
       {
           label.setBorder(null);
           label.setFont(table.getFont());
       }
       label.setText((String)value);
       return label;
    }

    public void setTargetCell(int row, int col)
    {
       targetRow = row;
       targetCol = col;
    }
} 

共 (1) 个答案

  1. # 1 楼答案

    有两种方法可以实现这一点:

    • 正如Reimeus所建议的,执行一次解析,以查找特定搜索关键字的所有出现,并将其位置存储在列表中。然后调用你的showSearchResults()并遍历列表

    • 第二种选择是将上次扫描的位置存储在某个地方。然后当用户按下下一步时,从这个位置开始搜索,而不是再次(0,0)

    我个人更喜欢第一个选项,因为我不必重复扫描此表。此外,此列表将帮助我轻松实现“上一个”和“下一个”功能

    编辑:这是实现这一点的一种方法(请注意,您必须根据自己的需求进行定制,这只是为了帮助您开始):

    private void search8() {
        ArrayList<String> resultList = new ArrayList<String>();
    
        String target8 = sear8.getText();
        for (int row = 0; row < table8.getRowCount(); row++) {
            for (int col = 0; col < table8.getColumnCount(); col++) {
                String next8 = (String) table8.getValueAt(row, col);
                if (next8.contains(target8)) {
                    resultList.add(row + "," + col);
                }
            }
        }
    
        System.out.println(sarr8.length);
    
        String[] tokens;
        for (String result : resultList) {
            try {
                tokens = result.split("[,]");
                showSearchResults(tokens[0], tokens[1]);
            } finally {
                tokens = null;
            }
        }
    
        /**
         * Your remaining part
         */
    }