2014-02-27 114 views
8

我在java中製作了一個JTable。 我可以做任何事情,除了在我的表中搜索一個元素。 我想工作的一個輸入對話框,這就是我在這一刻:如何搜索JTable java中的元素?

btnSearch = new JButton("Search"); 
    btnSearch.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     {  
      String name = JOptionPane.showInputDialog("Wat wil je zoeken?"); 
     } 
    }); 
    add(btnSearch); 

我想用一個循環做到這一點。 但我不知道如何。 有人可以幫我嗎?

+2

要創建JTable中,您將使用datatableModel。在那你可以執行搜索。 – Rahul

回答

2

一個JTable的模型對數據進行保存,通過搜索它,你應該能夠檢查它是否包含你想要什麼 :

for(int i = 0; i < table.getRowCount(); i++){//For each row 
     for(int j = 0; j < table.getColumnCount(); j++){//For each column in that row 
      if(table.getModel().getValueAt(i, j).equals("STRING_TO_SEARCH")){//Search the model 
       System.out.println(table.getModel().getValueAt(i, j));//Print if found string 
      } 
     }//For loop inner 
    }//For loop outer 

祝你好運!

+0

然後爲什麼理由RowFilter那裏 – mKorbel

+0

這是一個很好的例子,因爲用戶要求搜索而不是過濾。當您想要從jtable中搜索記錄時,您希望自動選擇該記錄,並使該表的其他行可見。在過濾jtable時,唯一可見的行是包含輸入關鍵字的行。 – aurelianr

0

這裏是JTable搜索文本的例子在JTextField

源進入:Filter table by the text in a TextField

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.RowFilter; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class RegexTable { 
    public static void main(String args[]) { 
    JFrame frame = new JFrame("Regexing JTable"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Object rows[][] = { { "A", "About", 44.36 }, { "B", "Boy", 44.84 }, { "C", "Cat", 463.63 }, 
     { "D", "Day", 27.14 }, { "E", "Eat", 44.57 }, { "F", "Fail", 23.15 }, 
     { "G", "Good", 4.40 }, { "H", "Hot", 24.96 }, { "I", "Ivey", 5.45 }, 
     { "J", "Jack", 49.54 }, { "K", "Kids", 280.00 } }; 
    String columns[] = { "Symbol", "Name", "Price" }; 
    TableModel model = new DefaultTableModel(rows, columns) { 
     public Class getColumnClass(int column) { 
     Class returnValue; 
     if ((column >= 0) && (column < getColumnCount())) { 
      returnValue = getValueAt(0, column).getClass(); 
     } else { 
      returnValue = Object.class; 
     } 
     return returnValue; 
     } 
    }; 

    final JTable table = new JTable(model); 
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
    table.setRowSorter(sorter); 
    JScrollPane pane = new JScrollPane(table); 
    frame.add(pane, BorderLayout.CENTER); 

    JPanel panel = new JPanel(new BorderLayout()); 
    JLabel label = new JLabel("Filter"); 
    panel.add(label, BorderLayout.WEST); 
    final JTextField filterText = new JTextField("A"); 
    panel.add(filterText, BorderLayout.CENTER); 
    frame.add(panel, BorderLayout.NORTH); 
    JButton button = new JButton("Filter"); 
    button.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)); 
     } 
     } 
    }); 
    frame.add(button, BorderLayout.SOUTH); 
    frame.setSize(300, 250); 
    frame.setVisible(true); 
    } 

} 
34

你可能想使用RowFilter來過濾搜索結果。以下是使用RowFilterDocumentListener的示例。當用戶鍵入時,行將被動態過濾。

請參閱RowFilter api和DocumentListener api。如果您不喜歡動態過濾,您可以堅持使用按鈕,或者您可以將ActionListener添加到JTextField,因此當輸入被按下時,將過濾該過濾器。你會把聽者回調(actionPerformed)的代碼也只是

String text = jtfFilter.getText(); 
    if (text.trim().length() == 0) { 
    rowSorter.setRowFilter(null); 
    } else { 
    rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 
    } 

enter image description here

import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.RowFilter; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class TestTableSortFilter extends JPanel { 

    private String[] columnNames 
      = {"Country", "Capital", "Population in Millions", "Democracy"}; 

    private Object[][] data = { 
     {"USA", "Washington DC", 280, true}, 
     {"Canada", "Ottawa", 32, true}, 
     {"United Kingdom", "London", 60, true}, 
     {"Germany", "Berlin", 83, true}, 
     {"France", "Paris", 60, true}, 
     {"Norway", "Oslo", 4.5, true}, 
     {"India", "New Delhi", 1046, true} 
    }; 

    private DefaultTableModel model = new DefaultTableModel(data, columnNames); 
    private JTable jTable = new JTable(model); 

    private TableRowSorter<TableModel> rowSorter 
      = new TableRowSorter<>(jTable.getModel()); 

    private JTextField jtfFilter = new JTextField(); 
    private JButton jbtFilter = new JButton("Filter"); 

    public TestTableSortFilter() { 
     jTable.setRowSorter(rowSorter); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(new JLabel("Specify a word to match:"), 
       BorderLayout.WEST); 
     panel.add(jtfFilter, BorderLayout.CENTER); 

     setLayout(new BorderLayout()); 
     add(panel, BorderLayout.SOUTH); 
     add(new JScrollPane(jTable), BorderLayout.CENTER); 

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

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       String text = jtfFilter.getText(); 

       if (text.trim().length() == 0) { 
        rowSorter.setRowFilter(null); 
       } else { 
        rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 
       } 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       String text = jtfFilter.getText(); 

       if (text.trim().length() == 0) { 
        rowSorter.setRowFilter(null); 
       } else { 
        rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 
       } 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
      } 

     }); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JFrame frame = new JFrame("Row Filter"); 
       frame.add(new TestTableSortFilter()); 
       frame.pack(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 
} 
+0

謝謝。幫了很多。你值得擁有超過** Upvote **。乾杯 – mustangDC

+0

進口缺少,搜索框不工作 – Stepan

+0

謝謝!優秀的例子和易於使用! – user1314776

0

只是注意 如果getValueAt排序,這將導致原始行索引之後。 (這將是錯誤的對象) 在這種情況下,你可以使用:JTable API

這將轉化排序行索引到原始行

0

你可以使用這個類和使用JTable的變量調用函數並且jtext字段參數應該傳遞給函數。希望充分享受代碼

import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.RowFilter; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class FilterJtable { 

public void FilterJtable(JTable jTable, JTextField jtfFilter) { 
    TableRowSorter<TableModel> rowSorter = new TableRowSorter<>(jTable.getModel()); 
    jTable.setRowSorter(rowSorter); 
    jtfFilter.getDocument().addDocumentListener(new DocumentListener(){ 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      String text = jtfFilter.getText(); 

      if (text.trim().length() == 0) { 
       rowSorter.setRowFilter(null); 
      } else { 
       rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 
      } 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      String text = jtfFilter.getText(); 

      if (text.trim().length() == 0) { 
       rowSorter.setRowFilter(null); 
      } else { 
       rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 
      } 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

    }); 
} 

}