Проверка и выделение JTable Cell - PullRequest
1 голос
/ 18 февраля 2012

Я выделяю JTable ячеек на основе проверки. В некоторых условиях я должен принять значение других столбцов. Например, если column2 имеет США, то column3 должно быть только числовым. В качестве другого примера, если col2 - это "США" , а 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]

1 Ответ

2 голосов
/ 18 февраля 2012

@ Клеопатра и @mKorbel верны.Ваш фрагмент неполный, но он выглядит , как будто вы пытаетесь решить проблемы редактора и модели в рендере.

Вы можете проверить введенные значения в пользовательском TableCellEditor, как показано наэто пример .Вы можете обрабатывать зависимых столбцов в TableModel, как показано в этом примере .

В комментарии вы говорите: «Если я не ошибаюсь, prepareRenderer() требуется зацикливание всех строк, верно? "

Нет, JTable" внутренние реализации всегда используют этот метод для подготовки средств визуализации, чтобы это поведение по умолчанию моглобыть безопасно переопределенным подклассом. "Переопределение prepareRenderer() наиболее полезно, когда изменения необходимо выборочно применять к всем средствам визуализации.

См. Концепции: редакторы и средства визуализации для получения дополнительной информации.подробности.

...