/* * @(#)Number.java 1.30 05/11/17 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */
package java.lang;
/** {...} */ public abstract class Number implements java.io.Serializable {...}
Warum fehlt hier das extends Object? Die API sagt mir das dort ein Vererbung sein müsste. Ich dachte ALLE Klassen in Java haben Object als Oberklasse. Ich glaub ich falle vom glauben.
Das eigentliche Problem ist folgendes: Ich setze den Renderer für einen JTable:
metricsTable.setDefaultRenderer(Object.class, new MetricsTableCellRenderer());
In der Klasse MetricsTableCellRenderer überschreibe ich die Methode getTableCellRendererComponent:
@Override 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); if (value instanceof Double) {...} return c }
Die Überprüfung ergibt aber niemals true. Wenn ich jedoch:
metricsTable.setDefaultRenderer(Double.class, new MetricsTableCellRenderer());
Ich benutze nun für jeden Datentypen in der Tabelle einen eigenen Renderer falls nötig. Innerhalb der Renderer-Klasse überschreibe ich die Methode setValue().
Die eine ist leicht zu beantworten: Object ist direkt oder indirekt die Oberklasse aller Java-Klassen. Eben weil das so ist, muß man es nicht hinschreiben - ein fehlendes "extends" wird automatisch ein "extends Object".
Die andere - warum funktioniert das Rendering nicht - ist schwieriger. Ich kenne mich mit der JTable nicht aus, aber zwei potentielle Ursachen kämen für mich in Frage: - der Mechanismus unterstützt keine Vererbung, d.h. ein Default-Render für Object wird nur für Object hergenommen, aber nicht für abgeleitete Klassen - was Du eigentlich rendern willst ist möglicherweise ein double, also gar keine Instanz einer Klasse, sondern ein Basisdatentyp und damit auch erst mal kein Object, und die zwei auf der Hand liegenden Schritte Autoboxing auf Double -> Verallgemeinern zu Object sind für die Implementierung dann doch einer zuviel.
Warum nimmst Du nicht einfach die funktionierende Variante? Das Design von setDefaultRenderer sieht mir ohnehin danach aus, dass an spezialisierte Renderer gedacht war und nicht an einen One-fits-all-Ansatz, in dem dann intern wieder mit instanceof differenziert wird.
setDefaultRenderer() wird anscheinend so verwendet wie du es sagst. Ich wollte nur nicht so viele kleine Renderer-Klassen erzeugen müssen für jeden Typ.
Warum fehlt hier das extends Object? Die API sagt mir das dort ein Vererbung sein müsste. Ich dachte ALLE Klassen in Java haben Object als Oberklasse. Ich glaub ich falle vom glauben.
Weil das der Compiler für dich macht. Bei keiner mir bekannten Sprache musst du explizit angeben dass deine Klasse von Object erbt. Sonst müsstest du ja immer ausnahmslos bei allen Klassen schreiben:
class Foo extends Object { }
was mehr als nervig wäre.
Das andere kann ich dir leider nicht beantworten, hätte aber eigentlich eh eine eigene Frage verdient wie ich finde.
Ich weiss nicht genau, was Du mit "Die Überprüfung ergibt aber niemals true." meinst. Wenn es "instanceof" sein sollte, dann probiere es einfach mal folgendermaßen:
Zum zweiten Teil der Frage: Die JTable hat intern schon einen Default-Renderer gesetzt, speziell für den Typ "Double". Solange man den nicht explizit mit einem anderen, speziellen Renderer für "Double" überschreibt, wird für jeden Double-Wert der Default-Renderer verwendet.