2016-04-15 15 views
1

Ich erfolgreich Kontrollkästchen in JTable Spalte hinzufügen. aber ich möchte mein benutzerdefiniertes Kontrollkästchen verwenden, ich änderte BooleanRender, um mein benutzerdefiniertes Kontrollkästchen zu erweitern, und es funktioniert. Das Problem ist, wenn ich das Kontrollkästchen aktiviert, zeigt es Standard-JCheckbox-Design im Moment und meine Coustom-Checkbox zeigen, geschieht es auch, wenn ich nicht ausgewählt das Kontrollkästchen. here is the question I asked beforeCheckbox Renderer falsch in JTable Spalte

class BooleanRenderer extends TriCheckBox implements TableCellRenderer, UIResource { 

private static final long serialVersionUID = 1L; 
private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); 

BooleanRenderer() { 
    super(); 
    setHorizontalAlignment(JLabel.CENTER); 
    setBorderPainted(true); 
} 

@Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    if (isSelected) { 
     setForeground(table.getSelectionForeground()); 
     super.setBackground(table.getSelectionBackground()); 
    } else { 
     setForeground(table.getForeground()); 
     setBackground(table.getBackground()); 
    } 
    setSelected(value != null && ((Boolean) value).booleanValue()); 
    if (hasFocus) { 
     setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); 
    } else { 
     setBorder(noFocusBorder); 
    } 
    return this; 
} 

}

public class TriCheckBox extends JCheckBox { 
public static ImageIcon icon =new ImageIcon("src/checkbox_off.png"); 
public static ImageIcon smallIcon = new ImageIcon(icon.getImage().getScaledInstance (12, -1, Image.SCALE_SMOOTH)); 
public static ImageIcon iconDark =new ImageIcon("src/logo.png"); 
public static ImageIcon smallIconDark = new ImageIcon(iconDark.getImage().getScaledInstance (12, -1, Image.SCALE_SMOOTH)); 
public static ImageIcon iconBrown =new ImageIcon("src/checkbox_on.png"); 
public static ImageIcon smallIconBrown = new ImageIcon(iconBrown.getImage().getScaledInstance (12, -1, Image.SCALE_SMOOTH)); 
private boolean indeterminate; 
@Override 
public void paint(Graphics g) { 
    if (isSelected()) { 
     indeterminate = false; 
    } 
    if(indeterminate){ 
     setIcon(smallIconDark); 
    }else if(isSelected()){ 
     setIcon(smallIconBrown); 
    }else{ 
     setIcon(smallIcon); 
    } 
    super.paint(g); 
} 
public boolean isIndetermainate() { 
    return indeterminate; 
} 
public void setIndetermainate(boolean indetermainate) { 
    this.indeterminate = indetermainate; 
    if (indetermainate) { 
     setSelected(false); 
     repaint(); 
    } 
} 

}

+0

1) Siehe [Erkennung/Korrektur für das Aufhängen der Nähe Klammer eines Codeblocks] (http://meta.stackexchange.com/q/251795/155831) für ein Problem konnte ich nicht mehr gestört werden Festsetzung. 2) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. –

+0

'public static ImageIcon Symbol = new ImageIcon (" src/checkbox_off.png ");' 3) Anwendungsressourcen werden zum Zeitpunkt der Bereitstellung zu eingebetteten Ressourcen, daher ist es ratsam, sofort auf sie zuzugreifen, als ob sie gerade wären. Auf ein [tag: embedded-resource] muss nicht die Datei, sondern die URL zugreifen. Siehe [Info. Seite für eingebettete Ressource] (http://stackoverflow.com/tags/embedded-resource/info) zum Erstellen der URL. 4) Die Verwendung von "statisch" verursacht öfter Probleme, als sie löst. Entferne alle "statischen" Modifikatoren, bevor du MCVE veröffentlichst (oben erwähnt und verlinkt). –

Antwort

2

Erstens ist es keine gute Idee, die paint(...) Methode außer Kraft zu setzen, wenn Sie etwas Malerei tun wollen, überschreiben die paintComponent(...) Methode statt.

In diesem Fall führen Sie kein benutzerdefiniertes Zeichnen durch, sodass Sie keine dieser Methoden überschreiben müssen. Hier ist, was Sie stattdessen tun:

public class TriCheckBox extends JCheckBox { 
    .... 

    public void updateState() { 
     if (isSelected()) { 
      indeterminate = false; 
     } 
     if(indeterminate){ 
      setIcon(smallIconDark); 
     }else if(isSelected()){ 
      setIcon(smallIconBrown); 
     }else{ 
      setIcon(smallIcon); 
     } 
    } 

    public void setIndetermainate(boolean indetermainate) { 
     this.indeterminate = indetermainate; 
     if (indetermainate) { 
      setSelected(false);   
     }else{ 
      updateState(); 
     } 
    } 

    @Override 
    public void setSelected(boolean selected){ 
     updateState(); 
    } 
} 
+1

Vielleicht möchten Sie sich 'public void updateState (Graphics g) {' anschauen, weil ich mir ziemlich sicher bin, dass Sie das nicht meinen;) – MadProgrammer

+0

@MadProgrammer Ich habe die OP's 'paint (....) kopiert 'Methode und vergessen, diesen Parameter zu entfernen. – Titus

1

Problem ist, wenn ich das Kontrollkästchen aktiviert es Standard JCheckBox Design bei Moment zeigen und meine coustom Checkbox zeigen, ist es auch passieren, wenn ich das Kontrollkästchen nicht ausgewählt.

starten durch einen Blick auf Concepts: Editors and Renderers nehmen und Using Other Editors

Genau wie die Tatsache, dass Sie eine benutzerdefinierte TableCellRenderer zu bieten hatte, wirst du eine benutzerdefinierte zu bieten haben TableCellEditor

Dann Zugabe zu was @Titus vorgeschlagen hat, sollten Sie nicht src in Ihre Wege

public static ImageIcon icon =new ImageIcon("src/checkbox_off.png"); 

Bedürfnisse bec Referenzierung werden ome

public static ImageIcon icon =new ImageIcon(TriCheckBox.class.getResource("/checkbox_off.png"));