Java JTable 组合框验证
Java JTable combobox validation
我想在这里做 3 件事:
首先,我试图让组合框显示 "not feed" 当你启动程序时,在它启动的那一刻什么都不显示,只有当我点击组合它显示选项 "feed" 和 "not feed"。
其次,我正在尝试对组合框进行验证,当我接下来单击 JButton
时,它将验证组合框是否全部 "feed" 如果是的话下一步,否则会弹出 "check again"
最后,我想让前 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));
}
}
示例输出:
阅读 Oracle 教程 - How to use tables - part about to use JComboBox as TableCellEditor、
- 说明
JTable
有两个独立的功能 TableCellEditor
用于编辑存储在 XxxTableModel
中的值和 TableCellRenderer
用于绘制存储在 XxxTableModel
中的值,
编辑你(事件,API 中实现的通知程序)后,只需使用 [=18 将所选值从 TableCellEditor
(JComboBox
)存储到 XxxTableModel
=],存储 "feed"
或 "not feed"
,而不是 JComboBox
作为 Object
,TableCellRenderer
只是从模型绘制到视图
默认情况下,一切都通过使用 DefaultTableModel
自动运行,然后需要覆盖减少数量的方法(getColumnClass
、isCellEditeble
,在你的情况下 setValueAt
可能也是)
有两种方法(第一种需要覆盖XxxTableModel.setValueAt
)
JButton
将被禁用(以编程方式),直到所有值将从空白更改为 "feed"
或 "not feed"
,需要在模型内部循环,注意执行代码行 super.setValueAt()
后,编辑器中的值将存储到模型中
来自 JButton
的动作在模型内部循环(原始,最简单,但最有效的验证,简单直接的代码,XxxTableModel.setValueAt
内部没有错误)
需要覆盖 XxxTableModel.setValueAt
并设置、更改 isCellEditable(row, column)
以更正值,需要为 isCellEditable
创建单独的数组,仅用于模型事件,不要从外部改变这个数组,只是方法 XxxTableModel.setValueAt
可以通知
如果可能,请使用 DefaultTableModel
(以避免在覆盖 AbstractTableModel
、方法、侦听器,尤其是模型通知程序所需的代码中出现任何错误解释 - fireXxxXxx
)
模型内部的代码排序很重要,首先要将值存储到模型,然后调用任何更改、验证、附加代码,只需基于模型中存储的值的代码
我敢肯定每三点都在这里几次,包括SSCCE/MCVE形式的工作代码示例
我想在这里做 3 件事:
首先,我试图让组合框显示 "not feed" 当你启动程序时,在它启动的那一刻什么都不显示,只有当我点击组合它显示选项 "feed" 和 "not feed"。
其次,我正在尝试对组合框进行验证,当我接下来单击
JButton
时,它将验证组合框是否全部 "feed" 如果是的话下一步,否则会弹出 "check again"最后,我想让前 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)); } }
示例输出:
阅读 Oracle 教程 - How to use tables - part about to use JComboBox as TableCellEditor、
- 说明
JTable
有两个独立的功能TableCellEditor
用于编辑存储在XxxTableModel
中的值和TableCellRenderer
用于绘制存储在XxxTableModel
中的值, 编辑你(事件,API 中实现的通知程序)后,只需使用 [=18 将所选值从
TableCellEditor
(JComboBox
)存储到XxxTableModel
=],存储"feed"
或"not feed"
,而不是JComboBox
作为Object
,TableCellRenderer
只是从模型绘制到视图默认情况下,一切都通过使用
DefaultTableModel
自动运行,然后需要覆盖减少数量的方法(getColumnClass
、isCellEditeble
,在你的情况下setValueAt
可能也是)
- 说明
有两种方法(第一种需要覆盖
XxxTableModel.setValueAt
)JButton
将被禁用(以编程方式),直到所有值将从空白更改为"feed"
或"not feed"
,需要在模型内部循环,注意执行代码行super.setValueAt()
后,编辑器中的值将存储到模型中来自
JButton
的动作在模型内部循环(原始,最简单,但最有效的验证,简单直接的代码,XxxTableModel.setValueAt
内部没有错误)
需要覆盖
XxxTableModel.setValueAt
并设置、更改isCellEditable(row, column)
以更正值,需要为isCellEditable
创建单独的数组,仅用于模型事件,不要从外部改变这个数组,只是方法XxxTableModel.setValueAt
可以通知
如果可能,请使用
DefaultTableModel
(以避免在覆盖AbstractTableModel
、方法、侦听器,尤其是模型通知程序所需的代码中出现任何错误解释 -fireXxxXxx
)模型内部的代码排序很重要,首先要将值存储到模型,然后调用任何更改、验证、附加代码,只需基于模型中存储的值的代码
我敢肯定每三点都在这里几次,包括SSCCE/MCVE形式的工作代码示例