URL: https://www.overclockers.at/coding-stuff/solved_java_eigene_swing_componente_eigene_ui_klas_156470/page_1 - zur Vollversion wechseln!
UIDefaults.getUI() failed: no ComponentUI class for: at.chrisone.swing.combo.JCalculatorComponentComboBox[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=16777224,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,selectedItemReminder=]
java.lang.Error
at javax.swing.UIDefaults.getUIError(UIDefaults.java:689)
at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:117)
at javax.swing.UIDefaults.getUI(UIDefaults.java:719)
at javax.swing.UIManager.getUI(UIManager.java:860)
ich habe eine neue klasse JAbstractComboBox definiert, diese definiert
private static final String uiClassID = "SimpleComboBoxUI";
L&F verwende ich den standard metal L&F, im eigenen package habe ich neben den implementierungen auch die MetalSimpleComboBoxUI liegen. eine MultiSimpleComboBoxUI habe ich nicht.
* brauche ich die Multi*UI klasse?
* darf ich mein UI nicht in meinem package liegen haben?
* muss ich meine UI klasse irgendwo registrieren?
hätte eigentlich gegooglet, aber nix passendes gefunden.
/edit: noch ein paar anmerkungen was ich eigentlich will:
ich habe eine KOPIE einer JComboBox die KEINE liste öffnet - daher eigene UI implementierung erforderlich...
Ich schätze mal, dass das das wirft, weil
und dass du das definieren musst.ZitatThe default implementation of this method throws an error, as it should never be invoked.
hmm ich definiere das ui nicht explizit, that's right. aber ich implementiere (genauso wie in der JComboBox) setUI mit welchem das zugehörige UI zur runtime eingesetzt wird (ist ja vom verwendeten L&F abhängig).
und vor genau diesem setUI versucht er in UIManager.java:860 (jdk) das UI per name zu ermitteln. genau dieses ClassForName findet nichts, und das führt zu obigem Problem.
warum das class for name nix findet ist mir unklar - leider zeigt mir mein eclipse debugger (warum auch immer) in dieser klasse keine werte an (kann watchen was ich will...), in meinen klassen funktionierts.
edit: solved
hatte gedacht die zuordnung klasse-UI geschieht mit konvention "plaf.<l&f-name>.<L&F-name><ComponentUI>, war ein Irtum von mir. muss scheinbar entweder
a) mein eigenes L&F vom bestehenden L&F ableiten, um meine Komponente dem L&F beizubringen [see MotifLookAndFeel.initClassDefaults(UIDefaults)] oder
b) bei Anwendungsstart und jedem Layout-Wechsel meine Komponente am L&F registrieren [UIManager.put(F_uiClassID, F_fqcn);]
scheint da gibts keinen gscheiteren weg herum, wenn wer andere ideen hat bitte posten.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025