JTable disabilita la casella di controllo nella cella

Ciao ho un JTable E voglio eliminare tutte le caselle di controllo disabilitate che ho provato con un renderizzatore personalizzato che controlla isEnabled () e poi cambia il colore di sfondo ma non funziona ancora. Eventuali suggerimenti? Grazie!!!

Come notato in Concetti: Editor e Renderer , “un renderer a cella singola viene generalmente utilizzato per disegnare tutte le celle che contengono lo stesso tipo di dati.” Dovrai mantenere lo stato enabled nel tuo modello di tabella .

Addendum: come esempio concreto, il modello di dati in questo esempio è una semplice matrice di istanze di Date . Override di getTableCellRendererComponent() come mostrato di seguito causa la disabilitazione dei giorni dispari. In questo caso, essere dispari è una proprietà inerente al valore Date stesso, ma il modello potrebbe essere interrogato per qualsiasi proprietà correlata.

immagine disabilitata

 @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { Calendar calendar = Calendar.getInstance(); calendar.setTime((Date) value); Component c = super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, col); c.setEnabled(calendar.get(Calendar.DAY_OF_MONTH) % 2 == 0); return c; } 

Addendum: nell’esempio sopra, il DateRenderer viene evocato perché TableModel restituisce il token di tipo Date.class , per il quale è stato Date.class come predefinito.

 table.setDefaultRenderer(Date.class, new DateRenderer()); 

Un aspetto identico può essere ottenuto sovrascrivendo prepareRenderer() come mostrato di seguito, ma il metodo viene invocato per tutte le celle, indipendentemente dalla class. Di conseguenza, prepareRenderer() è l’ideale per influire su intere righe, come mostrato nel rendering della riga della tabella .

 private final JTable table = new JTable(model) { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { Component c = super.prepareRenderer(renderer, row, col); if (col == DATE_COL) { Calendar calendar = Calendar.getInstance(); calendar.setTime((Date) model.getValueAt(row, col)); c.setEnabled(calendar.get(Calendar.DAY_OF_MONTH) % 2 == 0); } return c; } };