Java JTable 组合框验证

Java JTable combobox validation

我想在这里做 3 件事:

  1. 首先,我试图让组合框显示 "not feed" 当你启动程序时,在它启动的那一刻什么都不显示,只有当我点击组合它显示选项 "feed" 和 "not feed"。

  2. 其次,我正在尝试对组合框进行验证,当我接下来单击 JButton 时,它将验证组合框是否全部 "feed" 如果是的话下一步,否则会弹出 "check again"

  3. 最后,我想让前 4 列的单元格不可编辑,最后一列可编辑。

    public class DosageTableHelper  {
    private static JTable toDoTable;
    private static JScrollPane jpane;
    private static int counter=1;
    public static DefaultTableModel getElderlyFromQueryDos(String timing,String position) throws SQLException {
        SQLObject so = new SQLObject();
        ResultSet rs = null;
    
        if(timing.equalsIgnoreCase("Morning")){
            PreparedStatement stmt  = so.getPreparedStatementWithKey("SELECT morningdosage FROM et_elderly WHERE name = ?");
            stmt.setString(1,position);
            stmt.executeQuery();
            System.out.println(stmt);
            rs = stmt.getResultSet();
        }
        else if(timing.equalsIgnoreCase("Afternoon")){
            PreparedStatement stmt  = so.getPreparedStatementWithKey("SELECT afternoondosage FROM et_elderly WHERE name = ?");
            stmt.setString(1,position);
            stmt.executeQuery();
            System.out.println(stmt);
            rs = stmt.getResultSet();
        }
        else if(timing.equalsIgnoreCase("Noon")){
            PreparedStatement stmt  = so.getPreparedStatementWithKey("SELECT noondosage FROM et_elderly WHERE name = ?");
            stmt.setString(1,position);
            stmt.executeQuery();
            System.out.println(stmt);
            rs = stmt.getResultSet();
        }
        return (DefaultTableModel) buildTableModel(rs);
    }
    
    
    
    @SuppressWarnings("unchecked")
    public static DefaultTableModel buildTableModel(ResultSet rs) throws SQLException {
        ArrayList<DosageObject> DosageList=null;
    
    
        System.out.println(rs);
        try {
            while(rs.next()){
                ByteArrayInputStream in = new ByteArrayInputStream(rs.getBytes(1));
                ObjectInputStream is = new ObjectInputStream(in);
                Object retrieveDosBlob =(Object) is.readObject();
                if(retrieveDosBlob instanceof  ArrayList<?>){
                    DosageList=((ArrayList<DosageObject>) retrieveDosBlob);
                }
            }
        } catch (ClassNotFoundException e) {
    
            e.printStackTrace();
        } catch (IOException e) {
    
            e.printStackTrace();
        }
    
        // storing array list in an array list for future uses
    
        Vector<String> columnNames = new Vector<String>();
    
        columnNames.add("Description");
        columnNames.add("Prescription");
        columnNames.add("Medication Type");
        columnNames.add("Dosage");
        columnNames.add("Checked");
    
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    
    
    
    
    
        for(int k=0;k<DosageList.size();k++){
            Vector<Object> vector = new Vector<Object>();
            vector.add(DosageList.get(k).getMedDescrip());
            vector.add(DosageList.get(k).getMedPrescrip());
            vector.add(DosageList.get(k).getMedType());
            vector.add(DosageList.get(k).getMedDosage());
    
            data.add(vector);
        }
    
    
        DefaultTableModel dtm = new DefaultTableModel(data, columnNames) {
            private static final long serialVersionUID = 4234183862785566645L;
    
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return !( rowIndex == 1 && columnIndex == 1 );
            }
    
    
        };
        return dtm;
    }
    
    
    // Debug-able main method
    public static void main(String[] args) throws SQLException {
        ArrayList<String> nameList= new ArrayList<String>();
        nameList.add("Lee Ching Chong");
        nameList.add("Lim Kuay Siak");
        nameList.add("Lee Ching Chong");
    
        toDoTable =new JTable(getElderlyFromQueryDos("morning",nameList.get(0)));
    
    
        String[] values = new String[] { "Not Feed", "Feed" };
        TableColumn col = toDoTable.getColumnModel().getColumn(4);
        col.setCellEditor(new MyComboBoxEditor(values));
        col.setCellRenderer(new MyComboBoxRenderer(values));
    
        jpane = new JScrollPane(toDoTable);
        JPanel panel = new JPanel();
        JFrame frame = new JFrame();
        frame.setBounds(0, 0, 700, 543);
        panel.add(jpane);
        frame.getContentPane().add(new JScrollPane(panel));
    
        JButton btnNext = new JButton("Next");
        panel.add(btnNext);
        frame.setVisible(true);
        btnNext.addActionListener(new ActionListener() {
    
            public void actionPerformed(ActionEvent e) {
                try {
                    toDoTable.setModel(DosageTableHelper.getElderlyFromQueryDos("morning",nameList.get(counter)));
                    String[] values = new String[] { "Not Feed", "Feed" };
                    TableColumn col = toDoTable.getColumnModel().getColumn(4);
                    col.setCellEditor(new MyComboBoxEditor(values));
                    col.setCellRenderer(new MyComboBoxRenderer(values));
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
    
    
    
                counter++;
    
            }
    
        });
    
    }
    
    
    
    }
    @SuppressWarnings("rawtypes")
    class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
    
    private static final long serialVersionUID = 1319299961084034009L;
    
    @SuppressWarnings("unchecked")
    public MyComboBoxRenderer(String[] items) {
        super(items);
    }
    
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            super.setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
        }
        setSelectedItem(value);
        return this;
    }
    }
    class MyComboBoxEditor extends DefaultCellEditor {
    
    private static final long serialVersionUID = -1702063500403826596L;
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
    }
    

示例输出:

  1. 阅读 Oracle 教程 - How to use tables - part about to use JComboBox as TableCellEditor

    • 说明 JTable 有两个独立的功能 TableCellEditor 用于编辑存储在 XxxTableModel 中的值和 TableCellRenderer 用于绘制存储在 XxxTableModel 中的值,
    • 编辑你(事件,API 中实现的通知程序)后,只需使用 [=18 将所选值从 TableCellEditorJComboBox)存储到 XxxTableModel =],存储 "feed""not feed",而不是 JComboBox 作为 ObjectTableCellRenderer 只是从模型绘制到视图

    • 默认情况下,一切都通过使用 DefaultTableModel 自动运行,然后需要覆盖减少数量的方法(getColumnClassisCellEditeble,在你的情况下 setValueAt 可能也是)

  2. 有两种方法(第一种需要覆盖XxxTableModel.setValueAt

    • JButton 将被禁用(以编程方式),直到所有值将从空白更改为 "feed""not feed",需要在模型内部循环,注意执行代码行 super.setValueAt() 后,编辑器中的值将存储到模型中

    • 来自 JButton 的动作在模型内部循环(原始,最简单,但最有效的验证,简单直接的代码,XxxTableModel.setValueAt 内部没有错误)

  3. 需要覆盖 XxxTableModel.setValueAt 并设置、更改 isCellEditable(row, column) 以更正值,需要为 isCellEditable 创建单独的数组,仅用于模型事件,不要从外部改变这个数组,只是方法 XxxTableModel.setValueAt 可以通知


  • 如果可能,请使用 DefaultTableModel(以避免在覆盖 AbstractTableModel、方法、侦听器,尤其是模型通知程序所需的代码中出现任何错误解释 - fireXxxXxx )

  • 模型内部的代码排序很重要,首先要将值存储到模型,然后调用任何更改、验证、附加代码,只需基于模型中存储的值的代码

  • 我敢肯定每三点都在这里几次,包括SSCCE/MCVE形式的工作代码示例