我基于验证突出显示JTable
个单元格。在某些情况下,我必须采取其他列的值。例如,如果column2
有美国,那么column3
应该只是数字。另一个例子,如果col2
是“USA”且 col4
是数字,那么col5
应该只有三个字符。有人可以建议如何做到这一点?
在下面的片段中,col3
包含国家/地区名称; col4
和col5
取决于col3
。当我在case 3
和case 4
时,我无法检查case 2
的值。例如,我想要if (col3.value == "USA")
。
[code]
tcol = editorTable.getColumnModel().getColumn(0);
tcol.setCellRenderer(new CustomTableCellRenderer());
tcol = editorTable.getColumnModel().getColumn(1);
tcol.setCellRenderer(new CustomTableCellRenderer());
tcol = editorTable.getColumnModel().getColumn(2);
tcol.setCellRenderer(new CustomTableCellRenderer());
public class CustomTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent (JTable table, Object
value,boolean isSelected, boolean hasFocus, int row, int col){
Component cell = super.getTableCellRendererComponent(table, value,
isSelected,hasFocus, row, col);
if (value instanceof String) {
String str = (String) value;
switch (col) {
case 0:
col1(str, cell);
break;
case 1:
col2(str, cell);
break;
case 2:
col3(str, cell);
break;
}
}
return cell;
}
private void col1(String str, Component cell) {
if(!str.matches("[0-9a-zA-z]")){
cell.setBackground(Color.RED);
} else {
cell.setBackground(Color.GREEN);
}
}
private void col2(String str, Component cell) {
if(!str.matches("[A-Z]{3}")){
cell.setBackground(Color.RED);
} else {
cell.setBackground(Color.GREEN);
}
}
[/code]
答案 0 :(得分:2)
@kleopatra和@mKorbel是正确的。您的片段不完整,但出现,就像您尝试解决渲染器中的编辑器和模型问题一样。
您可以在自定义TableCellEditor
中验证输入的值,如example所示。您可以在TableModel
中处理相关列,如example所示。
在评论中你说,“如果我没错,prepareRenderer()
需要循环所有行,对吗?”
不,JTable
“内部实现总是使用此方法来准备渲染器,以便子类可以安全地覆盖此默认行为。”当必须有选择地将更改应用于所有渲染器时,覆盖prepareRenderer()
最有用。
有关详细信息,请参阅Concepts: Editors and Renderers。