| 

.NET C# Java Javascript Exception

1
Folgende Klasse verwende ich:

/*
* @(#)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());
verwende klappt es.

Ich bin ratlos...
News:
11.02.2011
schilkschi 43 1 5
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().
schilkschi 14.02.2011
4 Antworten
1
Das sind ja eigentlich zwei Fragen.

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.
11.02.2011
Matthias Hlawatsch 13,2k 4 9
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.
schilkschi 14.02.2011
1
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.
11.02.2011
Logdog82 856 1 8
Sry demnächst mach ich dafür zwei Fragen...
schilkschi 14.02.2011
0
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:
value.getClass().equals(Double.class)
11.02.2011
oopexpert 455 1 8
Ob ich nun [code]value instanceof Double[/code] oder [code]value.getClass().equals(Double.class)[/code] bringt nichts.
schilkschi 14.02.2011
0
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.
23.02.2011
Marco13 286 1 2

Stelle deine Java-Frage jetzt!