Domanda

Sto evidenziando JTable celle basate sulla validazione. In alcune condizioni, devo prendere il valore di altre colonne. Ad esempio, se column2 allora ha gli Stati Uniti column3 dovrebbe essere solo numerico. Come un altro esempio, se col2 è "USA" e col4 è numerico, quindi col5 Dovrebbero essere solo tre carattere. Qualcuno può suggerire come si può fare?

Nel frammento sottostante, col3 contiene nomi di paesi; col4 e col5 dipende da col3. Quando sono dentro case 3 e in case 4, Non posso controllare il valore di case 2. Ad esempio, voglio come, 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]
È stato utile?

Soluzione

@kleopatra e @mkorbel sono corretti. Il tuo frammento è incompleto, ma esso appare Come se stessi cercando di risolvere i problemi di editor e modellare nel rendering.

È possibile convalidare i valori inseriti in un'usanza TableCellEditor, come mostrato in questo esempio. Puoi gestire dipendente colonne nel TableModel, come mostrato in questo esempio.

In un commento dici: "Se non ho torto, prepareRenderer() Ha bisogno di looping di tutte le file, giusto? "

No, JTable "Le implementazioni interne utilizzano sempre questo metodo per preparare i rendering in modo che questo comportamento predefinito possa essere sovrascritto in modo sicuro da una sottoclasse." Prevalente prepareRenderer() è molto utile quando le modifiche devono essere applicate selettivamente tutto rendering.

Vedere Concetti: redattori e rendering per ulteriori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top