在 jTable java 中搜索元素
searching an element in jTable java
下面是一个家伙是如何做到的例子
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);
}
});
}
}
它工作正常,但问题是当我尝试从这条线的点击中获取价值时
((DefaultTableModel) jTableZ.getjTable1().getModel()).getValueAt(row, 36))
它没有 return 这个程序搜索的行,而是我得到 returned 行,那是首先放在 jTable 中的行,没有 search.Let 我的尝试解释:
当我的 jTable 中有多行并且搜索将其缩小为 1 行时,我将进入 return 旧 jTable 中的第一行,而不是行程序搜索它。如何解决?
我忘记写了,我的数据不是这里的,而是
private Vector<Vector<String>> data
要通过 JTable 进行搜索,请尝试这样的操作:
For(int row=0;row<C.ROWS; row++){
For(int col=0;col<C.COLS; col++){
if(table.getValueAt(row, col) == (Object) O){
System.out.print(Hello);
}
}
}
取决于您是否设置 JTable 上每个单元格中的值,我在这个场合使用对象。
我已经解决了它而不是 getSelectedRow 我不得不将它转换成 rowIndex 模型来获取选定的行
private int row = jTable1().getSelectedRow();
private int rowModel=jTable1().convertRowIndexToModel(row);
而且效果很好:)
下面是一个家伙是如何做到的例子
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);
}
});
}
}
它工作正常,但问题是当我尝试从这条线的点击中获取价值时
((DefaultTableModel) jTableZ.getjTable1().getModel()).getValueAt(row, 36))
它没有 return 这个程序搜索的行,而是我得到 returned 行,那是首先放在 jTable 中的行,没有 search.Let 我的尝试解释: 当我的 jTable 中有多行并且搜索将其缩小为 1 行时,我将进入 return 旧 jTable 中的第一行,而不是行程序搜索它。如何解决?
我忘记写了,我的数据不是这里的,而是
private Vector<Vector<String>> data
要通过 JTable 进行搜索,请尝试这样的操作:
For(int row=0;row<C.ROWS; row++){
For(int col=0;col<C.COLS; col++){
if(table.getValueAt(row, col) == (Object) O){
System.out.print(Hello);
}
}
}
取决于您是否设置 JTable 上每个单元格中的值,我在这个场合使用对象。
我已经解决了它而不是 getSelectedRow 我不得不将它转换成 rowIndex 模型来获取选定的行
private int row = jTable1().getSelectedRow();
private int rowModel=jTable1().convertRowIndexToModel(row);
而且效果很好:)