验证并突出显示JTable Cell

时间:2012-02-18 09:56:50

标签: java swing jtable tablecellrenderer

我基于验证突出显示JTable个单元格。在某些情况下,我必须采取其他列的值。例如,如果column2有美国,那么column3应该只是数字。另一个例子,如果col2是“USA” col4是数字,那么col5应该只有三个字符。有人可以建议如何做到这一点?

在下面的片段中,col3包含国家/地区名称; col4col5取决于col3。当我在case 3case 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]

1 个答案:

答案 0 :(得分:2)

@kleopatra和@mKorbel是正确的。您的片段不完整,但出现,就像您尝试解决渲染器中的编辑器和模型问题一样。

您可以在自定义TableCellEditor中验证输入的值,如example所示。您可以在TableModel中处理相关列,如example所示。

在评论中你说,“如果我没错,prepareRenderer()需要循环所有行,对吗?”

不,JTable“内部实现总是使用此方法来准备渲染器,以便子类可以安全地覆盖此默认行为。”当必须有选择地将更改应用于所有渲染器时,覆盖prepareRenderer()最有用。

有关详细信息,请参阅Concepts: Editors and Renderers