0

JTextfield に名前を入力しますが、テーブルは何もフィルタリングしません!

私のコード:

public class UserPage_Admin extends JFrame {

JTable table;
UserModel model;
public UserPage_Admin() {

    model = new UserModel(...);
    TableRowSorter sorter = new TableRowSorter<TableModel>(model);
    table = new JTable(model);
    table.setRowSorter(sorter);

    add(new JScrollPane(table), BorderLayout.CENTER);
    add(panelForm(), BorderLayout.PAGE_START);

    RowFilter<UserModel, Object> rf = null;
    try {
        rf = RowFilter.regexFilter(filterTF.getText(), 0);
    } catch (PatternSyntaxException pse) {
        return;
    }
    sorter.setRowFilter(rf);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(850, 600);
    setVisible(true);
}
4

3 に答える 3

8

コンストラクタで呼び出していますRowFilter.regexFilter(filterTF.getText(), 0);。filterTF からテキストUserPage_Admin()を読み取る方法。次のように、テキストの送信 (クリック) 時に呼び出される に割り当てられたアクション イベント リスナーから呼び出す必要があると思います。JButton

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

ユーザー キー タイプ イベントでフィルタリングを使用する場合は、入力フィルター文字列を取得するテキスト フィールドにキー リスナーを追加します。

filterTxtFeild.addKeyListener(new KeyAdapter() {
            public void keykeyReleased(KeyEvent evt) {
              // on each key type event filter. 
             // put your filter code as submit button
            }
        });

ただし、以下のコメントで示唆されているように、Swing テキスト コンポーネントを操作するには、Document.addDocumentListener(DocumentListener). Swing テキスト コンポーネントは、Documentを使用してそのコンテンツを表します。ドキュメント イベントは、ドキュメントの内容が何らかの形で変更されたときに発生します。ドキュメント リスナーを次のように追加します。

filterTxtFeild.getDocument().addDocumentListener(new DocumentListener() {

      @Override
      public void insertUpdate(DocumentEvent e) {
        // put your filter code here upon data insertion
      }

      @Override
      public void removeUpdate(DocumentEvent e) 
      { 
            //put your filter code here upon data removal
      }

      @Override
      public void changedUpdate(DocumentEvent e) {}
    });

編集: DocumentListener が望ましいのはなぜですか?

データ ソースでの入力の検証が必要な場合、KeyEventデータのフィルター処理中に使用すると、ユーザーのキーストロークが反映されず、入力イベントがデータ ソースによって処理される前にリスナーに送信されます。を入力したいときuser nameに、誰かが のようなテキストを入力したとします"$%^&"。このような無効な入力でKeyEventは、データ ソースに有効な変更が加えられていなくても、引き続き発生します。ただし、DocumentListenersデータ ソースに有効な変更が加えられた場合にのみ通知されます。データ入力コンポーネントは、validatorがリッスンできるイベントを生成します。テキスト コンポーネントの内容を 内から変更してはasynchronouslyなりません。その場合、プログラムはデッドロックする可能性があります。DocumentListener

于 2013-10-14T16:31:25.220 に答える
1

JTextfield に名前を入力しますが、テーブルは何もフィルタリングしません!

  • 2つの方法がありますが、予想されるロジックについては言及していません

    1. DocumentListener からの KeyTyped でのフィルタリング (あなたのコードは ??? について話している)

    2. ENTER キーから呼び出された ActionListener から

  • どちらも JTextField に追加される方法です


  • 次に、さらに2つの非常に重要なオプションがあります

    1. JTables、列、および行全体でのフィルタリング (あなたのコードは ??? について話している)

    2. 1 つの列 (2 つ以上の列で可能ですが、試したことはありません)


  • すべてはあなたの目標次第

  • APIに実装された標準メソッドを使用してすべて

于 2013-10-14T17:54:33.363 に答える
0

初期化後にソーターを使用できません。JTable.setRowSorter()を呼び出す必要があります。

于 2013-10-14T16:19:26.353 に答える