2

データベースからのデータが入力されたJTableがあります。データがJTextFieldに入力されたときにセルを強調表示する検索関数を追加しました。しかし、正確な単語または数字を入力する必要がある瞬間に、私がやりたいのは、ほんの数文字または数字を検索できるようにすることです。JTableは、それらの文字または数字を含む結果を表示します。

私は使用しようとしました:

button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String text = jTextField1.getText();
            if (text.length() == 0) {
                sorter.setRowFilter(null);
            } else {
                sorter.setRowFilter(RowFilter.regexFilter(text));
            }
        }
    });

しかし、それはJTableに影響を与えるようです。

だから私はこのコードを使用しました:

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(1, 1, 1, 1, Color.BLACK));
        }

        return this;
    }
}

private void searchResultsActionPerformed(ActionEvent evt) {
    String value = jTextField1.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());
                }
            }
        }
    }
}

これは、JTextFieldに入力されたデータを使用して機能しますが、前述のように、正確な名前または番号を入力する必要があります。それは私がそれを機能させたい方法ではありません。

どんな助けでも大歓迎です。

4

1 に答える 1

4

あなたのテスト

value.equals(table.getValueAt(row, col))

あなたが説明する動作を引き起こします。equals完全一致でのみ機能します。

次のようなもう少し洗練されたものを試すことができます

Object value = table.getValueAt(row, col);
if (value!=null && value.toString().matches(".*"+Pattern.quote(text)+".*"))
   ...

個人的には、レンダラーでこのテストを実行して、一致するすべてのセルが強調表示されるようにします (引き続き実行する必要がありますがscrollRect()、レンダラーでは実行しません)。

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 (value!=null && value.toString().matches(".*"+Pattern.quote(text)+".*")) {

            // this will customize that kind of border that will be use to highlight a row
            setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
        } else
            setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1);

        return this;
    }
}

そして、actionPerformed呼び出されるたびに、私は呼び出しますtable.repaint();

于 2013-01-02T23:00:12.857 に答える