import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GUI extends JFrame{
String [] col = {"Last Name", "First Name", "HKID", "Student ID", "Final Exam Score"};
String [][] data = new String [1][5];
public JFrame j;
public JPanel p;
public JLabel search;
public JTextField s;
public JButton enter;
public JButton NEW;
public JButton unedit;
public JButton update;
public JButton exam;
public DefaultTableModel model = new DefaultTableModel(data, col);;
public JTable jt = new JTable(model);
public GUI(){
setVisible(true);
setSize(600,400);
setTitle("Student Record Management System");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p = new JPanel();
search = new JLabel("Search: ");
s = new JTextField(" ");
enter = new JButton("Enter");
enter.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
enterPressed();
}
});
p.add(search);
p.add(s);
p.add(enter);
NEW = new JButton("Edit");
NEW.setBounds(10,10,20,20);
NEW.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
updatePressed();
}
});
p.add(NEW);
unedit = new JButton("Unedit");
unedit.setBounds(70,80,20, 20);
unedit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
uneditPressed();
}
});
p.add(unedit);
update = new JButton("Add Student");
update.setBounds(50,40,20,20);
update.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
NEWpressed();
}
});
p.add(update);
jt.setEnabled(false);
jt.setAutoCreateRowSorter(true);
jt.setPreferredScrollableViewportSize(new Dimension(500,300));
jt.setFillsViewportHeight(true);
jt.setBackground(Color.GRAY);
jt.setAlignmentY(BOTTOM_ALIGNMENT);
JScrollPane jps = new JScrollPane(jt);
p.add(jps);
add(p);
}
public void NEWpressed(){
model.addRow(new Object[]{" ", " ", " ", " ", " "});
}
public void updatePressed(){
jt.setEnabled(true);
}
public void uneditPressed(){
jt.setEnabled(false);
}
public void enterPressed(){
String get = s.getText().toString();
for(int x=0; x< get.length(); x++){
if(data[x].equals(get)){
model= new DefaultTableModel(data[x], col);
}else{
model = new DefaultTableModel(data, col);
}
}
}
public static void main(String args []){
GUI a = new GUI();
a.setVisible(true);
}
}
在JTable
上搜索JTextField
时,我希望它只显示我在搜索栏上键入的内容。
在enterPressed()
方法下,我打算通过让程序检查输入文本字段的每个字母来过滤结果,然后将JTable
重置为这些结果。
尝试用data[x]
重置DefaultTableModel
时出错。data[x]
应该是输入到文本字段中的任何内容
如果这不是正确的方法,请解释使用标准Java API。这不包括DocumentListener
等。。。。也许我需要两个循环。也不确定所做的if语句是否真的在做我认为它正在做的事情,但它应该意味着如果在text字段中输入的文本等于JTable
中的数据,那么将JTable
重置为等于在JTextField
中输入的内容
JTable
支持通过分拣机API进行过滤。
查看如何使用表格教程中的排序和筛选
例如。。。
public void enterPressed() {
RowFilter<DefaultTableModel, Integer> filter;
filter = new RowFilter<DefaultTableModel, Integer>() {
@Override
public boolean include(RowFilter.Entry<? extends DefaultTableModel, ? extends Integer> entry) {
String filter = s.getText();
DefaultTableModel model = entry.getModel();
int row = entry.getIdentifier();
boolean include = false;
if (model.getValueAt(row, 0).toString().contains(filter) || model.getValueAt(row, 0).toString().contains(filter)) {
include = true;
}
return include;
}
};
((TableRowSorter)jt.getRowSorter()).setRowFilter(filter);
// String get = s.getText().toString();
// for (int x = 0; x < get.length(); x++) {
// if (data[x].equals(get)) {
// model = new DefaultTableModel(data[x], col);
// } else {
// model = new DefaultTableModel(data, col);
// }
// }
}
这个简单的示例比较前两列,看看它们是否包含s
JTextField
中包含的文本。
如果需要,可以使用String#startsWith
来查找以您输入的文本开头的String
匹配项。
这个例子也是区分大小写的,您可以在String
(过滤器和列值(上使用toLowerCase
来否定它,或者如果您想要一个绝对匹配的,则可以使用equalsIgnoresCase
不要使用null
布局。像素完美的布局在现代UI设计中是一种幻觉,你无法控制字体、DPI、渲染管道或其他会改变组件在屏幕上渲染方式的因素。
Swing的设计目的是与布局管理器合作来克服这些问题。如果你坚持忽略这些功能,并反对API设计,请做好准备,迎接大量令人头痛的工作和永无止境的艰苦工作。。。