Java JTable组合框验证

时间:2016-01-16 07:54:41

标签: java swing combobox jtable jcombobox

我想在这里做三件事:

  1. 首先,我试图让组合框显示"而不是Feed"当你对程序进行启动时,它启动时它只显示任何内容,只有当我点击组合框时它才会显示选项" feed"并且"没有饲料"。

  2. 其次我正在尝试对组合框进行验证,当我点击下一个JButton时,它将验证组合框是否全部" feed"如果是这样你去下一个,否则它会弹出一个说"再次检查"

  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));
    }
    }
    
  4. 示例输出: enter image description here

1 个答案:

答案 0 :(得分:1)

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

    • 解释JTable有两个单独的功能TableCellEditor,用于编辑存储在XxxTableModelTableCellRenderer中的值,用于绘制存储在XxxTableModel中的值,
    • 编辑您(在API中实现的事件,通知程序)后,只需使用TableCellEditorJComboBoxXxxTableModel)中的选定值存储到XxxTableModel.setValueAt,存储"feed""not feed",而不是JComboBox作为ObjectTableCellRenderer只是从模型绘制到视图

    • 默认情况下,所有内容都会使用DefaultTableModel自动生成,然后需要覆盖减少数量的方法(getColumnClassisCellEditeble,在您的情况下setValueAt可能也是)

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

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

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

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

    • 如果可能的话,使用XxxTableModel.setValueAt(以避免在覆盖DefaultTableModel,方法,监听器以及特别是模型通知所需的代码中进行任何错误解释 - AbstractTableModel

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

    • 我确信每三个点都在这里几次,包括SSCCE / MCVE表格中的工作代码示例