Java JTable 组合框验证

标签 java swing combobox jtable jcombobox

我在这里尝试做三件事:

  1. 首先,我试图让组合框在启动程序时显示“不提供”,在启动程序时它只显示任何内容,只有当我单击组合框时它才会显示该选项“喂食”和“不喂食”。

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

示例输出: enter image description here

最佳答案

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

    • 解释JTable有两个独立的功能TableCellEditor用于编辑存储在 XxxTableModel 中的值和TableCellRenderer用于绘制存储在 XxxTableModel 中的值,
    • 编辑后(事件、API 中实现的通知程序),仅存储 TableCellEditor 中选定的值( JComboBox ) 到 XxxTableModel通过使用XxxTableModel.setValueAt ,存储"feed""not feed" ,不是JComboBoxObject , TableCellRenderer只是从模型到 View 进行绘制

    • 默认情况下,使用 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 if 是可能的(以避免重写 AbstractTableModel 、方法、监听器,特别是模型通知程序所需的代码中的任何误解 - fireXxxXxx )

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

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

关于Java JTable 组合框验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34824794/

相关文章:

java - 试图遍历数组中的数组

python - 根据组合框 1 填充组合框 2

c# - 有没有办法将命令绑定(bind)到 ListView 或 ComboBox 选择?

java - 在Java中动态设置JTextField中的文本

java - 如何在没有用户单击的情况下单击 JButton?

WPF MVVM ComboBox SelectedItem 或 SelectedValue 不起作用

java - 在 Activity 之间传递数据强制关闭

具有固定开始和重复 block 的字符串的Java正则表达式

java - H2数据库控制台: how to connect to an embedded H2 JPA database?

java - Java 9 中的 JFrame 缩放