【问题标题】:Java JTable combobox validationJava JTable 组合框验证
【发布时间】:2016-01-16 07:54:41
【问题描述】:

我在这里尝试做 3 件事:

  1. 首先我试图让组合框在你启动程序时显示“不进纸”,在它启动的那一刻它什么都不显示,只有当我点击组合框时它才会显示选项“喂”和“不喂”。

  2. 其次,我正在尝试对组合框进行验证,当我单击 JButton 下一步时,它将验证组合框是否全部为“提要”,如果是这样,您将继续下一步,否则它将有一个弹出说“再次检查”

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

样本输出:

【问题讨论】:

    标签: java swing combobox jtable jcombobox


    【解决方案1】:
    1. 阅读 Oracle 教程 - How to use tables - part about to use JComboBox as TableCellEditor

      • 解释JTable有两个独立的功能TableCellEditor用于编辑XxxTableModel中存储的值和TableCellRenderer用于绘制XxxTableModel中存储的值,
      • 在编辑您(事件,在 API 中实现的通知器)后,只需使用 XxxTableModel.setValueAt 将选定值从 TableCellEditor (JComboBox) 存储到 XxxTableModel,以存储 "feed""not feed" , 而不是 JComboBoxObject, TableCellRenderer 只是从模型绘制到视图

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

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

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

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

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


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

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

    • 我确信每三个点都会出现几次,包括 SSCCE / MCVE 表单中的工作代码示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      相关资源
      最近更新 更多