Frage

Das treibt mich absolut verrückt.

Ich weiß, dass, um die Formatierung von Tabellenzellen mit JTable zu ändern, ich habe meine eigenen Renderer zu verwenden. Aber ich kann nicht scheinen, diese richtig zu implementieren.

Dies ist meine aktuelle Setup:

public class MyClass
{
    public static void main(String args[])
    {
        JTable myTable = new JTable(10, 10);
        myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
    }
}

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Formatting
        return c;
    }
}

Was brauche ich für den ersten Parameter von setDefaultRenderer zu benutzen? Die API sagt nur ‚Klasse‘. Ich habe keine Ahnung, was dort zu setzen.

Könnte jemand nur erklären, in der einfachsten Bedingungen, wie ich über die Umsetzung dieses gehen? Bitte geben Sie ein Beispiel, wie ich die Formatierung innerhalb der main() Methode ändern auch.

War es hilfreich?

Lösung

Im ersten Parameter für setDefaultRenderer, legen Sie die Klasse wörtliche für die Klasse, die Sie wollen Rendering außer Kraft zu setzen. Das heißt, wenn Ihre Daten alle Saiten bestehen, können Sie setzen

myTable.setDefaultRenderer(String.class, new CustomRenderer());

Wenn Ihre Daten besteht auch aus Werten mit BigDecimal oder Integer als Klassen, müssen Sie für jede Klasse-Typ (BigDecimal.class oder Integer.class jeweils), die Methode mehrmals aufrufen.

Und schließlich, um die Hintergrundfarbe, die Sie dies in Ihrem Renderer tun zu ändern:

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(new java.awt.Color(255, 72, 72));
        return c;
    }
}

Wenn Sie einen Renderer schreiben, die für alle Klassen einer Schnittstelle funktionieren sollte, müssen Sie auch die getColumnClass Funktion Ihres Tischmodell ändern, und lassen Sie es die Rückkehr Interface-Klasse für alle Objekte, die diese Schnittstelle implementieren:

public Class<? extends Object> getColumnClass(int c) {
    Object object = getValueAt(0, c);
    if(object == null) {
        return Object.class;
    if(getValueAt(0, c) instanceof IColorable) {
        return ICarPart.class;
    } else {
        return getValueAt(0, c).getClass();
    }
}

Damit man einen Renderer für IColorable.class registrieren und benötigt keine separaten Renderer für jede Implementierung zu registrieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top