我想有一个 JTable 的功能,其中我将提供一个文本字段来输入要从 JTable 搜索的值,如果这个输入的值与 JTable 中的任何单元格值匹配,那么应该突出显示该特定单元格和单元格字体应变为粗体。当用户在文本字段中指定值后按 Enter 键时,将匹配这些值。
我怎样才能做到这一点?
这是解决问题的一种方法。这是代码:
public class JTableSearchAndHighlight extends JFrame {
   private JTextField searchField;
   private JTable table;
   private JPanel panel;
   private JScrollPane scroll;
   public JTableSearchAndHighlight() {
     initializeInventory();
   }
private void initializeInventory() {
    panel = new JPanel();
    searchField = new JTextField();
    panel.setLayout(null);
    final String[] columnNames = {"Name", "Surname", "Age"};
    final Object[][] data = {{"Jhon", "Java", "23"}, {"Stupid", "Stupido", "500"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
                            {"Max", "Dumbass", "10"}, {"Melanie", "Martin", "500"},
                            {"Jollibe", "Mcdonalds", "15"}};
    table = new JTable(data, columnNames);
    table.setColumnSelectionAllowed(true);
    table.setRowSelectionAllowed(true);
    scroll = new JScrollPane(table);
    scroll.setBounds(0, 200, 900, 150);
    searchField.setBounds(10, 100, 150, 20);
    searchField.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String value = searchField.getText();
            for (int row = 0; row <= table.getRowCount() - 1; row++) {
                for (int col = 0; col <= table.getColumnCount() - 1; col++) {
                    if (value.equals(table.getValueAt(row, col))) {
                        // this will automatically set the view of the scroll in the location of the value
                        table.scrollRectToVisible(table.getCellRect(row, 0, true));
                        // this will automatically set the focus of the searched/selected row/value
                        table.setRowSelectionInterval(row, row);
                        for (int i = 0; i <= table.getColumnCount() - 1; i++) {
                            table.getColumnModel().getColumn(i).setCellRenderer(new HighlightRenderer());
                        }
                    }
                }
            }
        }
    });
    panel.add(searchField);
    panel.add(scroll);
    getContentPane().add(panel);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Inventory Window");
    setSize(900, 400);
    setLocationRelativeTo(null);
    setVisible(true);
}
private class HighlightRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        // everything as usual
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        // added behavior
        if(row == table.getSelectedRow()) {
            // this will customize that kind of border that will be use to highlight a row
            setBorder(BorderFactory.createMatteBorder(2, 1, 2, 1, Color.BLACK));
        }
        return this;
    }
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new JTableSearchAndHighlight();
        }
    });
  }
}
来自 SwingX 项目的JXTable内置支持搜索表(查找Searchable界面)。它还允许快速创建使用此Searchable接口的搜索字段:JXSearchField和/或JXSearchPanel。
如果我没记错的话,这将满足您的大部分要求。可能只需要添加一些自定义代码来使单元格内容加粗