问一下enterPressed方法有什么问题?

时间:2014-05-01 03:10:26

标签: java swing user-interface jtable jtextfield

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);

        }

    }     

JTextField上进行搜索JTable时,我希望它只显示我在搜索栏中输入的内容。

enterPressed()方法下,我打算通过让程序检查输入到文本字段中的每个字母来过滤结果,然后将JTable重置为这些结果。

尝试使用DefaultTableModel重置data[x]时出错。 data[x]应该是输入文本域的内容

如果这不是正确的方法,请使用标准Java API进行说明。这是排除DocumentListener之类的......也许我需要双循环这里。还不确定if语句是否实际上正在做我认为它正在做的事情,但它应该意味着在textfield中输入的文本是否等于JTable中的数据然后将JTable重置为等于JTextField

中输入的内容

1 个答案:

答案 0 :(得分:2)

JTable支持通过分拣机API进行过滤。

Sorting and Filtering教程

中查看How to use Tables

例如......

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个匹配项。

该示例也区分大小写,您可以在toLowerCase上使用String(过滤器​​和列值)来否定此项,或者equalsIgnoresCase如果您想要绝对匹配< / p>

不要使用null布局。像素完美布局是现代UI设计中的一种幻觉,您无法控制字体,DPI,渲染管道或其他因素,这些因素将改变组件在屏幕上呈现的方式。

Swing旨在与布局管理员合作以克服这些问题。如果你坚持忽略这些功能并违背API设计,那就要做好准备应对很多令人头疼的事情,永远不要过时努力......