This page (revision-22) was last changed on 03-Jan-2011 16:54 by ThomasBayen 

This page was created on 01-Sep-2008 13:19 by ThomasBayen

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
22 03-Jan-2011 16:54 14 KB ThomasBayen to previous Linkliste zu Wizards in Swing
21 03-Jan-2011 15:26 14 KB ThomasBayen to previous | to last Linkliste zu Wizards in Swing

Page References

Incoming links Outgoing links

Version management

Difference between version and

= Swing-Tips =

Bei der Arbeit mit Swing stößt man fast ständig an Besonderheiten und Eingenschaften, deren genaue Funktion man sich erst erarbeiten muss. Um solche Dinge für Andere Menschen und für mich zu erhalten und um vielleicht selber von den Tipps anderer Javaner zu profitieren, habe ich diese Seite begonnen, um sie hier zu erklären.



>>== <<Application Framework ==

Wer stärker bemuttert werden will als Swing alleine das vermag, kann mit einem Framework oder einer sog. Plattform viele Basis-Aufgaben einer Applikation wie z.B. die Erstellung von Fenstern, Menüs, aber auch nicht-Swing-Problemen, an eine Bibliothek abgeben. Hierzu gibt es den Artikel JavaApplicationFramework.



==
>>JTable wie ein Spreadsheet benutzen ==

Der eigentliche Sinn einer editierbaren JTable ist meiner Meinung nach, dem Benutzer halbwegs das Gefühl zu geben, das er beim editieren eines Spreadsheets (also in MS Excel oder ~OpenOffice.org Calc) hat. Leider ist das "Feeling" etwas anders, was meiner Meinung nach unnötig die Benutzer verstört. <<IchIdeen>> <<möchtehierzu>> <<jedenfinden>> <<Unterschied,sich>> <<auf >>der <<michSeite>> <<stört,JTableAlsSpreadsheet.


==
>> <<hierbeiZuordnung>> <<einzelnvon>> <<behandeln.Tastenfunktionen ==>>

<<===In>> <<sofortigeseiner>> <<löschenTabelle>> <<beimhatte>> <<editierenich>> <<===

Wenn
damit
>> <<gekämpft, daß >>man <<einemit>> <<TextzelleTAB>> <<(z.B.nicht>> <<mitin>> <<derdie>> <<Maus)nächste>> <<aktiviertTabellenzelle>> <<hatkam.>> <<undDer>> <<dannFehler>> <<einelag>> <<alphanumerischeganz>> <<Tastewoanders,>> <<drückt,aber>> <<wirdich>> <<diesehabe>> <<Tasteetwas>> <<anüber>> <<dasdie>> <<EndeZuordnung>> <<desvon>> <<bestehendenTasten>> <<Texteszu>> <<angefügt.Aktionen>> <<Dasgelernt.>> <<gleicheWer>> <<passiertalso>> <<beimwissen>> <<Drückenwill,>> <<vonwie>> <<F2.besondere>> <<InEvents>> <<OOowie>> <<Calcz.B.>> <<istCursortasten,>> <<esTAB,>> <<so,oder>> <<daßauch>> <<beimMausaktionen>> <<einfachenzugeordnet>> <<Drückenwerden,>> <<dersollte>> <<bestehendeeinfach>> <<Wertim>> <<immerganz>> <<überschriebennormalen>> <<wird[JavaTutorial|http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html])fündig>> <<undnachlesen.>> <<manDort>> <<F2ist>> <<drückensehr>> <<muss,gut>> <<umerklärt,>> <<denwas>> <<Wertes>> <<editierenmit>> <<zu~InputMap>> <<können.und ~ActionMap auf sich hat.>>

<<Dieses
==
>> <<ProblemActions>> <<==

Das [Action|http://java.sun.com/javase/6/docs/api/javax/swing/Action.html]-Interface
>>ist <<aufgrundeigentlich>> <<dereine>> <<Strukturrecht>> <<dergute>> <<JTable-KlasseGrundidee.>> <<garEine>> <<nichtvon>> <<soeinem>> <<trivial,Programm>> <<wieausführbare>> <<ichFunktion>> <<dachte.wird>> <<Deshalbabstrahiert>> <<dokumentiereals>> <<ichAction>> <<hierverpackt>> <<einenund>> <<Teilkann>> <<desdann>> <<Weges,z.B.>> <<deneinem>> <<ichButton>> <<zuund/oder>> <<meinereinem>> <<LösungMenü>> <<genommenzugeordnet>> <<habe,werden.>> <<umLeider>> <<ggf.reicht>> <<späterdie>> <<beimImplementation>> <<nachbessernder>> <<Standard-Klassen vorne und hinten >>nicht <<allesaus,>> <<neuum>> <<suchenkomfortabel>> zu <<müssen:arbeiten. Auf der Seite JavaActions werden einige Aspekte von Actions diskutiert.>>

<<Zuerstmal
==
>> <<stehtZelle>> <<imin>> <<[Swingwiki|http://www.swingwiki.org/best:edit_cells_like_excel],einer>> <<daßTabelle>> <<dieaktiveren>> <<eine==

Wer
>> <<Lösungdurch>> <<hätten.ein>> <<DieseProgramm>> <<Lösung(also>> <<basiertnicht>> <<darauf,durch>> <<daßanklicken)>> <<eineine>> <<~DefaultCellEditorZelle>> <<gesetztaktivieren>> <<wird,will,>> <<dermuss>> sich <<beimgenau>> <<Aufrufüberlegen,>> <<automatischwas>> <<kompletter>> <<selektiert.denn>> <<Dasnun>> <<hilftwill.>> <<zwar,Es>> <<wenngibt>> <<ichdie>> <<eineSelektion>> <<alphanumerischeder>> <<TasteTabelle>> <<drücke,und>> <<selektiertdas>> <<aberFeld,>> <<beiauf>> <<F2dem>> <<ebenfallsder>> <<denTAB-Focus>> <<gesamtenliegt>> <<Text >>und <<verhindertdann>> <<somit,kann>> <<dases>> <<mannoch>> einen <<vorhandenengeöffneten>> <<ZelleninhaltEditor>> <<editieren(mit>> <<kann.

In
und
>> <<einemohne>> <<[Sun-Forum|http://forums.sun.com/thread.jspa?forumID=57&threadID=752727]Tastatur-Focus)>> <<stehtgeben.>> <<einAll>> <<Quelltext,dies>> <<vonsind>> <<demkomplett>> <<ichunterschiedliche>> <<überhauptDinge.>> <<nichtDas>> <<verstehe,Ergebnis,>> <<wasdas>> <<man am ehesten erwartet (das dem Klick mit >>der <<soll.Maus>> <<Icham>> <<habeehesten>> <<ihnentspricht),>> <<nichtgibt>> <<ausprobiert,meines>> <<Erachtens >>nach <<derfolgender>> <<BeschreibungCode:

{{{
>> <<sollte table.requestFocusInWindow();
>> <<er table.editCellAt(2,>> <<aber2);
>> << table.changeSelection(2, 2, false, false);
}}}
>>mit <<meinemden>> <<Problemfolgenden>> <<zuBefehlen>> <<tunwird>> <<haben.die Selektion verändert:>>
<<{{{>>
<<In>> <<einem table.getSelectionModel().setLeadSelectionIndex(2);
>> <<[Artikel|http://www.informit.com/articles/article.aspx?p=24130&seqNum=11] table.getColumnModel().getSelectionModel().setLeadSelectionIndex(2);
>> <<mit table.getSelectionModel().setAnchorSelectionIndex(2);
>> <<einem table.getColumnModel().getSelectionModel().setAnchorSelectionIndex(2);
}}}
evtl.
>> <<relativist>> <<einfachendas>> <<Niveauhier>> <<fanddann>> <<ichauch>> <<dennoch>> <<Hinweis,hilfreich:
{{{
>> <<wie table.scrollRectToVisible(table.getCellRect(2,>> <<Funktionstasten2,>> <<undtrue));
}}}

==
>> <<alphanumerischerichtig>> <<Tastengrosse>> <<überhauptListen>> <<behandeltanzeigen>> <<werden==

Das
>> <<und~ListModel>> <<wokann>> <<derprinzipiell>> <<Unterschiedauch>> <<liegt:mit>> <<Scheinbarrichtig>> <<wirdgrossen>> <<inListen>> <<~BasicTableUIumgehen.>> <<entschieden,Dabei>> <<obgibt>> es <<sichallerdings>> <<umein>> <<einepaar>> <<einzufügendeTricks.>> <<TasteZum>> <<odereinen>> <<einesollte>> <<Sondertasteman>> <<(z.B.mit>> <<PfeiltastesetPrototypeCellValue()>> <<odereinen>> <<F2)Wert>> <<handelt.mit>> <<F2maximaler>> <<wirdAusgabegröße>> <<dannsetzen,>> <<inum>> <<~BasicTableUI.actionPerformedzu>> <<alsverhindern,>> <<Actiondaß>> <<START_EDITINGbeim>> <<behandelt,Erstellen>> <<normaledes>> <<TastenWidgets>> <<inalle>> <<~JTable.processKeyBinding().Elemente testweise gezeichnet werden, um das Größte zu finden.>>

<<ParallelEin>> <<fandpaar>> <<ichzusätzliche>> <<Schwierigkeiten ergeben sich, wenn man eine richtig grosse Liste >>in <<einemeiner>> <<[Forumsthread~ComboBox>> <<zumverwenden>> <<Thema|http://forums.java.net/jive/thread.jspa?threadID=42682&tstart=0]will,>> <<eineninsbesondere>> <<Beitragwenn>> <<vondie>> <<"oswald",Zugriff>> <<derauf>> <<versuchtdie>> <<hatte,Elemente>> <<~processKeyBinding()langsam>> <<zuist>> <<überladen,(z.B.>> <<aberaus>> <<miteiner>> <<dieserDatenbank).>> <<IdeeHier>> <<nichtwerden>> <<vorwärtsgekommenan>> <<war.mehreren>> <<NachdemStellen>> <<ichSchleifen>> <<verwendet, um relativ simple Aufgaben zu lösen. Um >>das <<durchdachtzu>> <<hatte,umgehen,>> <<merktemüssen>> <<ich,ein>> <<daßpaar>> <<dieserMethoden>> <<Gedankeüberladen>> <<derund>> <<besteein>> <<war,bisschen>> <<gehackt werden. Das würde allerdings hier >>den <<Rahmen sprengen. Wer eine Datenbank-taugliche Lösung sucht, kann mich fragen, >>ich <<gesehenhabe>> <<hatte.hierfür>> <<Icheine>> <<beschäftigteabgeleitete>> <<Variante der ~ComboBox, die ich >>mit <<intensivertausenden>> <<von Einträgen benutze.  -- ThomasBayen



== ~JComboBox
>>mit <<dieserAutocompletion>> <<Methode,==

Für
>> <<fandrichtig>> <<dasgrosse>> <<Problem,Listen>> <<dasist>> <<oswaldes>> <<hatte,dann>> <<einenauch>> <<Workaroundsinnvoll,>> <<hierfürdiese>> <<undordentlich>> <<durchsuchen zu können. Dazu bedarf es einer Autovervollständigung (wie z.B. im Firefox URL-Feld). Ich >>habe <<folgendeetwas>> <<Lösunggegoogelt>> <<implementiert:und Ansätze hierzu unter folgenden Links gefunden:>>
<<{{{>>
<<public*>> <<classhttp://today.java.net/pub/a/today/2007/07/19/adding-auto-completion-to-swing-comboboxes.html>> <<SpreadsheetJTable->> <<extendsArtikel>> <<JTablezum>> <<{Vergleich mehrerer Lösungen (von 2007)>>
<<* http://www.orbital-computer.de/JComboBox/ - Artikel von Thomas Bierhance, der genau erklärt, wie es gemacht wird (von 2004)>>
<< protected*>> <<booleanhttps://swinglabs.org/>> <<processKeyBinding(KeyStrokeenthält>> <<ks,im>> <<KeyEvent~SwingX-Projekt>> <<e,eine sauber aufgebaute Lösung>>
<< int*>> <<condition,http://www.java.happycodings.com/Java_Swing/code6.html>> <<boolean->> <<pressed)einfaches,>> <<{undokumentiertes Beispiel>>
<< boolean*>> <<retValuehttp://snippets.dzone.com/posts/show/7633>> <<=->> <<false;einfaches, undokumentiertes Beispiel>>
<< /*>>
<< Swinglabs>> <<*enthält>> <<DerProjekte>> <<erstevon>> <<TeilSun,>> <<die potentiell in das nächste Java aufgenommen werden könnten. Das bedeutet, die dortige Lösung >>ist <<ausganz>> <<JComponent.processKeyBindinggut>> <<entnommen.dokumentiert,>> <<Ich
in
>> <<*eine>> <<würdeordentliche>> <<dasAPI>> <<jazerlegt>> <<gerneund>> <<aufrufen,integriert>> <<abersich>> <<dassauber>> <<kannmit>> <<Swing. Das ist im Prinzip die sauberste Lösung, die >>ich <<nicht,bisher>> <<weilgefunden>> <<eshabe. Leider unterstützt sie kein Filtern der Liste.>>
<<
Der
>> <<*obengenannte>> <<überlagert[Artikel>> <<ist.von>> <<(OderThomas>> <<gehtBierhance|http://www.orbital-computer.de/JComboBox/]>> <<dasscheint>> <<dochsowas>> <<irgendwie?)
wie
>> <<*/
InputMap
die
>> <<mapMutter>> <<=aller>> <<getInputMap(condition);
ActionMap
Autocompletion-Lösungen
>> <<amzu>> <<=sein.>> <<getActionMap();
if
Alle
>> <<(mapscheinen>> <<!=mehr>> <<nulloder>> <<&&weniger>> <<bei ihm abgeschrieben zu haben. Dieser Artikel ist sehr gut geschrieben und erklärt Schritt für Schritt, wie man sowas macht. Schön zu lesen, wenn man einfach mal einem, der sich in Swing auskennt, über die Schulter schauen möchte. Im übrigen hat er sich >>am <<!=Ende>> <<nulldes>> <<&&Artikels>> <<isEnabled())auch>> <<{
Object
meine
>> <<bindingGedanken>> <<=über>> <<map.get(ks);
Action
grosse
>> <<actionListen>> <<=und>> <<(bindingdie>> <<==Performance-Probleme>> <<null)gemacht.>> <<?Er>> <<nullhast>> <<:den>> <<am.get(binding);
if
gleichen
>> <<(actionBug>> <<!=gefunden>> <<null)wie>> <<{
retValue
ich
>> <<=und>> <<SwingUtilities.notifyAction(action,ihn>> <<ks,auch>> <<e,per>> <<this,Reflection>> <<egelöst. Was mich dabei auf die Palme bringt, ist, daß dieser Artikel seit 2004 im Netz steht, offensichtlich sogar irgendjemand aus Suns ~SwingX-Team ihn wahrgenommen und daran herumgebastelt hat und Sun/Oracle sowas bis heute nicht ins JDK bekommen hat. Also durfte ich mal wieder das Rad neu erfinden. -- ThomasBayen>>
<< .getModifiers());>>
<< }>>
<< }>>
<<=== noch zu lösende Probleme ===>>
<< /*>>
<< Leider>> <<*unterstützen>> <<Derviele>> <<InhaltLösungen>> <<diesesdas>> <<if-BlocksFiltern>> <<istnicht,>> <<ausdeshalb>> <<hier nochmal zur Erklärung: Wenn ich den Anfang eines Begriffes eingebe, mächte ich, daß in >>der <<super-MethodeListe>> <<entnommen.darunter>> <<Ich
nur
>> <<*noch>> <<erzeugedie>> <<hierEinträge>> <<stehen, >>die <<Editor-Komponentezu>> <<genausomeinem>> <<wieAnfang>> <<impassen>> <<Original.(wie>> <<Dann
im
>> <<*Firefox).>> <<selektiereDie>> <<ichSwinglabs-Lösung>> <<allerdingsz.B.>> <<denlässt>> <<ganzendie>> <<TextListe>> wie <<in
sie
>> <<*ist,>> <<Spreadsheet-Applikationengeht>> <<üblich.
aber
>> <<*/
//
automatisch
>> <<Startzum>> <<editingersten>> <<whenEintrag,>> <<ader>> <<keypasst.>> <<isOb>> <<typed.noch>> <<UIweitere>> <<classespassen>> <<cankönnten,>> <<disablesehe>> <<this
//
ich
>> <<behaviornicht (wenn die nicht direkt untereinander stehen).>>
<< //
Neben
>> <<bydem>> <<settingFiltern>> <<thesind>> <<clientmeine>> <<propertyAnforderungen>> <<JTable.autoStartsEditnoch:>> <<to
//
Der
>> <<Boolean.FALSE.
if
Umgang
>> <<(!retValue
&&
mit
>> <<conditionrichtig>> <<==grossen>> <<WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
&&
Listen
>> <<isFocusOwner()
&&
(also
>> <<!Boolean.FALSE
.equals(getClientProperty("JTable.autoStartsEdit")))
eine
>> <<{
//
API,
>> <<Wein>> <<dodie>> <<notich>> <<haveDatenbankzugriffe>> <<areinschreiben>> <<bindingkann)>> <<forsowie>> <<thedie>> <<event.
Component
Möglichkeit,
>> <<editorComponentdie>> <<=Trefferfunktion>> <<getEditorComponent();
if
selber
>> <<(editorComponentbestimmen>> <<==zu>> <<null)können>> <<{
//
(also
>> <<Onlynicht>> <<attemptnur>> <<toSuche>> <<installnach>> <<thedem>> <<editorAnfang>> <<ondes>> <<aStrings,>> <<KEY_PRESSED,
if
sondern
>> <<(eeine>> <<==eigene>> <<nullFunktion>> <<||z.B.>> <<e.getID()für>> <<!=reguläre>> <<KeyEvent.KEY_PRESSED)Ausdrücke>> <<{etc).>>
<< return false;>>
<< }
//
:
>> <<Don'tevtl.>> <<startist>> <<whendas>> <<justBuch>> <<a'Swing>> <<modifierHacks'>> <<isein>> <<pressed
int
guter
>> <<codeHinweis.>> <<=JavaBooklist.>> <<e.getKeyCode();>>
<< if


==
>> <<(codeOptimierung>> <<==des>> <<KeyEvent.VK_SHIFTZeichnens>> <<||unter>> <<codeSwing>> ==<< KeyEvent.VK_CONTROL>>
<< ||
Wer
>> <<codewissen>> <<==will,>> <<KeyEvent.VK_ALT)wie>> <<{
return
in
>> <<false;
}
//
Swing
>> <<Trywas>> <<towarum>> <<installin>> <<thewelcher>> <<editor
int
Methode
>> <<leadRowgezeichnet>> <<=wird>> <<getSelectionModel().getLeadSelectionIndex();
int
und
>> <<leadColumnwer>> <<=mehr>> <<getColumnModel().getSelectionModel()
.getLeadSelectionIndex();
if
über
>> <<(leadRowpaint(),>> <<!=repaint(),>> <<-1update(),>> <<&&doubleBuffered,>> <<leadColumnopaque>> <<!=und>> <<-1solche>> <<&&Sachen>> <<!isEditing())erfahren>> <<{
if
möchte,
>> <<(!editCellAt(leadRow,als>> <<leadColumn,er>> <<e))jemals>> <<{
return
wissen
>> <<false;wollte, sollte diesen Artikel lesen:>>
<< }>>
<< }http://java.sun.com/products/jfc/tsc/articles/painting/>>
<< editorComponent
Wer
>> <<=wissen>> <<getEditorComponent();
if
will,
>> <<(editorComponentwas>> <<==sein>> <<null)Programm>> <<{
return
so
>> <<false;
}
//
treibt,
>> <<-TB-
//
kann
>> <<selectdazu>> <<everythinghttp://freedesktop.org/wiki/Software/Xephyr>> <<(likebenutzen.>> <<SpreadsheetDas>> <<Appsist>> <<do)
if
ein
>> <<(editorComponentXnest-ähnlicher>> <<instanceofX-Server,>> <<JTextField)der>> <<{
((JTextField)
in
>> <<editorComponent).selectAll();einem Fenster arbeitet. Er hat einen Debug-Mode, der einem anzeigt, wann was gezeichnet wird. Das hilft dabei, mehrfache und unnötige refresh-Durchläufe zu finden.>>
<< }>>
<< }>>
<< }== disablen (ausgrauen) eines ganzen JPanel ==>>
<< /*>>
<< Wenn>> <<*man>> <<Jetztein>> <<rufekomplexes>> <<ichWidget>> <<denaus>> <<ganzenmehreren>> <<obigenUnterwidgets>> <<Sermonaufgebaut>> <<u.U.hat>> <<nochmal(z.B.>> <<auf,ein>> <<aberEingabeformular),>> <<das
will
>> <<*man>> <<kanndieses>> <<ichin>> <<nichtmanchen>> <<vermeiden.Fällen>> <<Inschon>> <<diesermal>> <<super-Methodeausser>> <<wirdBetrieb>> <<das
setzen.
>> <<*Mit>> <<processKeyBindingeinem>> <<deseinzelnen>> <<EditorsEingabefeld>> <<aufgerufen,wie>> <<einem [JTextField|http://java.sun.com/javase/6/docs/api/javax/swing/JTextField.html] macht man >>das <<ichdurch>> <<nichteinen>> <<anders
Aufruf
>> <<*von>> <<aufrufen[setEnabled(boolean)|http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#setEnabled(boolean)].>> <<darf,Man>> <<weilsetzt>> <<Swingdamit>> <<aber immer nur >>das <<leideraktuell>> <<nichtangesprochene>> <<publicWidget>> <<gemachtausser>> <<hat.Kraft>> <<:-(
und
>> <<*/
if
nicht
>> <<(!retValue)seine Tochterwidgets.>>
<< retValue
Dieses
>> <<=Problem>> <<super.processKeyBinding(ks,ist>> <<e,recht>> <<condition,schwierig>> <<pressed);
return
zu
>> <<retValue;lösen, weil Sun es scheinbar "vergessen" hat. Im groben gibt es zwei Methoden:>>
<< }>>
<<}

}}}

Das
*
>> <<Ergebnisrekursives>> <<dis-/enablen aller Tochterwidgets. Dabei >>ist <<jetzt,zu>> <<dasbeachten,>> <<daß es auch Widgets geben kann, die aus anderen Gründen bereits disabled sind. Diese muss >>man <<einerseitssich>> <<mitmerken,>> <<einerum>> <<normalendie>> <<Tasterichtigen>> <<später wieder zu enablen. In >>den <<Zellinhaltmeisten>> <<überschreibt,Fällen>> <<abersollte>> <<andererseitsdas>> <<miteine>> <<F2ordentliche>> <<auchLösung>> <<denergeben.>> <<vorhandenenHaben>> <<Inhaltsich>> <<editierendie>> <<kann!Tochterwidgets>> <<--in>> <<ThomasBayender Zwischenzeit jedoch verändert, gibt das völliges Chaos und ist nicht praktikabel. Ein Beispiel für eine solche Lösung findet sich unter http://tips4java.wordpress.com/2009/08/02/disabled-panel/>>

<<
===
*
>> <<LösungMan>> <<deserzeugt>> <<löschen-beim-editiereneine>> <<ProblemsArt>> <<mitGlasspane,>> <<~TableCellEditordie>> <<===man über das normale Widget legt und die es "ausgraut". Ausserdem muss man noch die Tastatur-Lsitener abschalten sowie das Widget und seine Töchter aus dem Focus-Traversal herausnehmen.>>
<<
**
>>Eine <<anderesolche>> Lösung <<hatgeht>> <<JensKapitzamit>> <<hierdem>> <<vorgestellt.[JXLayer|https://jxlayer.dev.java.net/].>> <<NachDieser>> <<meinenstellt>> <<Versucheneine>> <<funktioniertzusätzliche>> <<diesesSchicht>> <<genausozwischen>> <<gutdem>> <<wieBenutzer>> <<meineund>> <<Lösung.dem>> <<MirWidget>> <<fälltdar,>> <<esmit>> <<auchder>> <<schwer,man>> <<einealles>> <<dermögliche>> <<beidenmachen>> <<Lösungenkann,>> <<fürunter>> <<"besser"anderem>> <<zuauch>> <<erklären.das>> <<''(LediglichWidget>> <<habeausgrauen>> <<ichund>> <<beideaktivieren.>> <<JensInteressanterweise>> <<Lösungist>> das <<Gefühl,Ding>> <<so toll, >>daß <<man,ich>> <<wennnoch>> <<mannicht>> <<dortmal>> <<Delegationein>> <<durchsimples>> <<Ableitungausgrauen>> <<ersetzt,hinbekommen>> <<nochhabe.>> <<einige:-)>> <<ZeilenStattdessen>> <<Codegibt>> <<sparenes>> <<kann.)''einen>> <<--Blur-Effekt,>> <<ThomasBayenden ich aus einer Bildbearbeitungs-Bibliothek nehmen musste.>>
<<
Man
**
>> <<kannUnter>> <<http://tips4java.wordpress.com/2009/08/02/disabled-panel/ gibt >>es <<hierzu >>auch <<maleine>> <<einetwas>> <<wenigbodenständigere>> <<andersLösung,>> <<fürdie>> <<jedenaus>> <<Typedrei>> <<(hierJava-Klassen>> <<gehtbesteht,>> <<esdie>> <<jagut>> <<nurerklärt>> <<umsind>> <<String.class)und>> <<machenderen>> <<esFunktionsweise>> <<folgman>> <<einschnell>> <<kleinesverstehen>> <<Beispiel

{{{
//
kann.
>> <<GPLJe>> <<v2nach>> <<oderLook&Feel>> <<höherergibt>> <<;)sich>> <<
//
eine
>> <<(c)etwas>> <<2008seltsame>> <<JensFarbe>> <<Kapitzabeim>> <<;)
import
ausgrauen,
>> <<java.awt.Component;
import
die
>> <<java.awt.Dimension;
import
man
>> <<java.awt.event.KeyEvent;
import
im
>> <<java.util.EventObject;Quelltext aber einfach anpassen kann (statt der Suche im L&F einfach "Color(255,255,255)" nehmen).>>

<<import javax.swing.JFrame;>>
<<import javax.swing.JScrollPane;>>
<<import==>> <<javax.swing.JTable;
import
Hänger
>> <<javax.swing.event.CellEditorListener;
import
beim
>> <<javax.swing.table.TableCellEditor;
import
Debugging
>> <<javax.swing.text.JTextComponent;in einer ~JComboBox ==>>

<<publicFalls>> <<classman,>> <<Hz.B.>> <<{
mit
>> << Eclipse>> << publicCode>> <<staticdebuggen>> <<voidwill,>> <<main(String[]der>> <<args)innerhalb>> <<{
//
der
>> <<einfachesRender-Routine>> <<fenseter
JFrame
einer
>> <<f~JComboBox>> <<=läuft,>> <<newkann>> <<JFrame("a");
//
das
>> <<einzu>> <<paarProblemen>> <<testführen.>> <<daten
String[][]
Das
>> <<dgilt>> <<=z.B.>> <<newfür>> <<String[][]die>> <<{Implementierung>> <<{eines>> <<"A",eigenen>> <<"B",~JComboBoxModel>> <<"C"oder>> <<},für>> <<{diverse>> <<"A",Listener,>> <<"V",die>> <<"2"dort>> <<}aufgerufen>> <<};
JTable
werden
>> <<tkönnten.>> <<=Zum>> <<newBeginn>> <<JTable(d,des>> <<newZeichnens>> <<String[]der>> <<{Cmobobox>> <<"AAAA",sperrt>> <<"BBBBBBBBB",
"CCCCCCCCCCCCCCCC"
Swing
>> <<});
//
scheinbar
>> <<damitaus>> <<manirgendeinem>> <<wasGrund>> <<siehtden>> <<
JScrollPane
X-Server.
>> <<pHält>> <<=der>> <<newDebugger>> <<JScrollPane(t);
//
das
>> <<Programm >>nun <<denan>> <<editorder>> <<holen
final
flaschen
>> <<TableCellEditorStelle>> <<tcean,>> <<=so>> <<t.getDefaultEditor(Object.class);hängt der ganze X-Server. :-(>>

<<//Kurzfristige>> <<undAbhilfe>> <<einschafft>> <<wenighier>> <<ändern
//
das
>> <<sieheEinloggen>> <<flagauf>> <<selectder>> <<Textkonsole >>und <<getTableCellEditorComponentein>> <<sowieschnelles>> <<isCellEditable"{{killall>> <<
t.setDefaultEditor(Object.class,
java}}",
>> <<newda>> <<TableCellEditor()der>> <<{
//
X-Server
>> <<ichnicht>> <<musswirklich>> <<wissenabgestürzt,>> <<obsondern>> <<icheben>> <<diesenur>> <<componentegesperrt>> <<nunist.>> <<überschreibenAber>> <<solldamit>> <<oderist>> <<das Debugging-Problem ja immer noch >>nicht <<wiegelöst.

===
>> <<beiLösung>> <<oo1>> <<calc===

Wer
>> <<wennalso>> <<asolchen>> <<getipptCode>> <<wirdwirklich>> <<istdebuggen>> <<esmuss,>> <<überschreibenkann>> <<beies>> <<F2mit>> <<z.b.einem>> <<nurzweiten>> <<einX-Server>> <<anhängen!
so
>> << wie>> << privateich>> <<booleanmachen:>> <<selectIch>> <<=habe>> <<false;mit>>

<< >>  <<Xephyr>> << @Override:1>>
<<
einen
>> << eigenen>> << public"X-Server>> <<Componentim>> <<getTableCellEditorComponent(JTableFenster">> <<table,
für
>> << mein>> << ObjectProgramm>> <<value,gestartet>> <<boolean(sollte>> <<isSelected,mit>> <<int"Xnest">> <<row,auch>> <<intgehen).>> <<column)Dann>> <<{
//
bin
>> <<componenteich>> <<holen
Component
in
>> <<cmpdie>> <<=Eclipse>> <<tce.getTableCellEditorComponent(table,Startkonfiguration>> <<value,
isSelected,
gegangen
>> <<row,und>> <<column);

//
habe
>> <<wenndort>> <<!f2im>> <<dann"Environment">> <<allesden>> <<selct
//
Wert
>> <<ist"DISPLAY">> <<esauf>> <<eine":1">> <<textcomponentegesetzt.>> <<Nun läuft mein Programm innerhalb des Xephyr-Fensters und hängt auch >>nur <<siediesen>> <<kenntauf.>> <<selectAllEclipse>> <<!!!!!
if
(im
>> <<(cmpnormalen>> <<instanceofX-Server)>> <<JTextComponent)ist>> <<{aber weiterhin noch bedienbar und kann wunderbar zum Debuggen benutzt werden.>>
<<
Übrigens
>> << bin>> << ifich>> <<(select)auf>> <<{dieses>> <<//Problem>> <<wennschon>> <<vor einiger Zeit gestossen. Damals hatte ich mir notiert, daß ein Aufruf von "{{setLightWeightPopupEnabled(false);}}" auf der ~JComboBox auch hilft. Tat >>es <<selectiertjetzt>> <<werdenaber>> <<sollnicht>> <<->mehr.>> <<isCellEditableVielleicht>> <<setzthängt>> <<das von >>den <<flagUmständen>> <<
//
ab
>> <<dannund>> <<überschreibenist>> <<ermöglichen!
((JTextComponent)
im
>> <<cmp).selectAll();
select
Zweifelsfall
>> <<=auch>> <<false;
einen
>> << Versuch>> << }wert.>>
<< }>>
<<
return
Unter
>> <<cmp;
Umständen
>> << kann>> << }

man
>> << mit>> << @Override
"export
>> << DISPLAY=:1;>> << publicmetacity>> <<void&">> <<addCellEditorListener(CellEditorListenerauch>> <<l)den>> <<{Gnome Fenstermanager im Xephyr-Server starten, bevor man sein Java-Programm startet. Das erlaubt eine bessere Bedienung der Java-Fenster. -- ThomasBayen>>
<< tce.addCellEditorListener(l);>>
<< ===>> << Lösung>> << }2 ===>>

<< Nach>> << einigem>> << @Override
Googlen
>> << habe>> << publicich>> <<voidherausgefunden,>> <<cancelCellEditing()daß>> <<{ich nicht der einzige bin, der das Problem hat (http://bugs.sun.com/view_bug.do?bug_id=6517045 und vor allem http://bugs.sun.com/view_bug.do?bug_id=6714678). Dort war dann auch ein rettender Hinweis: In aktuellen Java-Versionen kann man mit >>
<< tce.cancelCellEditing();>>
<< >>  <<  }-Dsun.awt.disablegrab=true>>

<< als>> << VM-Parameter>> << @Override
das
>> << Problem>> << publicauch>> <<Objectumgehen.>> <<getCellEditorValue()''(Ich>> <<{
return
frage
>> <<tce.getCellEditorValue();
mich
>> << zwar,>> << }wenn jemand einen Schalter dafür eingebaut hat, warum der nicht immer eingeschaltet ist, aber was solls...)''>>

<<

==
>> << Wizards>> << @Overrideprogrammieren ==>>
<<
Ein
>> << jeder>> << publichat>> <<booleanwohl>> <<isCellEditable(EventObjectschon>> <<anEvent)mal>> <<{
if
einen
>> <<(anEventWizard>> <<instanceofbedient,>> <<KeyEvent)z.B.>> <<{in>> <<//der>> <<istForma>> <<esals>> <<eineinen>> <<TastenInstaller.>> <<eventDa>> <<
//
kommt
>> <<wernatürlich>> <<lustdie>> <<hatFrage>> <<kannauf,>> <<jawie>> <<nochman>> <<diesowas>> <<tastenselber>> <<codesprogrammieren>> <<abfangen!kann.>> <<-->Es>> <<f2geht>> <<istdabei>> <<keinzumeist>> <<KeyEventum>> <<!!!
//
eine
>> <<habAbfolge>> <<abervon>> <<auchSeiten,>> <<nichtin>> <<weiterdenen>> <<nachgegucktman>> <<
Eingaben
>> << tätigen>> << selectkann.>> <<=Diese>> <<true;
}
//
werden
>> <<ActionEventggf.>> <<überprüft und abhängig von den Eingaben >>kommt <<rausman>> <<undauf>> <<dassandere>> <<istSeiten>> <<einoder>> <<AWTnicht.>> <<eventAm>> <<Ende drückt man "Finish" >>und <<jedann>> <<nachspätestens>> <<demgeschieht>> <<welchesirgendetwas.>> <<kannIch>> <<eshabe>> <<einhier>> <<Keyevent,mal>> <<....eine>> <<seinSammlung von Links zum Thema aufgeführt:>>
<< System.out.println(anEvent);>>
<<//*>> <<mehr[Creating>> <<willWizard>> <<ichDialogs>> <<nichtwith>> <<Java Swing|http://java.sun.com/developer/technicalArticles/GUI/swing/wizard/] - Artikel von Sun, der zeigt, wie man es "von Hand" >>machen<<
return
>> <<tce.isCellEditable(anEvent);kann.>>
<< *>> << https://wizard.dev.java.net>> << }

-
>> << Wizard>> << @Override
API
>> << aus>> << publicden>> <<void[SwingLabs|https://swinglabs.dev.java.net/],>> <<removeCellEditorListener(CellEditorListenerbzw.>> <<l)von>> <<{
tce.removeCellEditorListener(l);
Sun-Mitarbeiter
>> << Tim>> << }Boudreau>>
<<
**
>> << [using>> << @Override
the
>> << Wizards>> << publicAPI|http://today.java.net/article/2006/02/24/using-wizard-api]>> <<boolean->> <<shouldSelectCell(EventObjectArtikel>> <<anEvent)der>> <<{
return
Entwickler
>> <<tce.shouldSelectCell(anEvent);dieses Projektes>>
<< **>> << [Zauberhafte>> << }

Dialoge|http://www.heise.de/ix/artikel/Zauberhafte-Dialoge-506947.html]
>> << ->> << @Override'''deutscher''' Artikel aus der iX>>
<< **>> << [Javaworld-Artikel|http://www.javaworld.com/javaworld/jw-04-2008/jw-04-opensourcejava-wizard-api.html]>> << public->> <<booleanebenfalls>> <<stopCellEditing()über>> <<{
return
die
>> <<tce.stopCellEditing();Wizard API>>
<< *>> << [Java>> << }

});
p.setPreferredSize(new
Wizard
>> <<Dimension(200,Framework|http://sourceforge.net/projects/jwf]>> <<400));
f.add(p);
f.pack();
//
(JWF)
>> <<anzeigen->> <<undälteres>> <<inProjekt,>> <<derwird>> <<consoleauch>> <<gucken
f.setVisible(true);

gelobt,
>> << letzte>> << }
}


}}}


==
Version
>> <<Zuordnungallerdings>> von <<Tastenfunktionen ==2002>>
<<
In
*
>> <<einer[CJWizard|http://code.google.com/p/cjwizard/]>> <<Tabelle->> <<hatteneueres>> <<ichProjekt.>> <<damitDer>> <<gekämpft,Autor>> <<sagt, >>daß <<maner>> <<mitauf>> <<TABder>> <<nichtWizard>> <<inAPI>> <<dieaufbaut>> <<nächsteund>> <<Tabellenzellees>> <<kam.besser>> <<Dergemacht>> <<Fehlerhat.>> <<lagscheint>> <<ganzein>> <<woanders,aktives>> <<aberProjekt>> <<ichzu>> <<habesein
**
>> <<etwashttp://code.google.com/p/cjwizard/wiki/QuickStartGuide>> <<über->> <<diekurze>> <<ZuordnungEinführung>> <<vonin>> <<Tastendiese>> <<zuBibliothek
*
>> <<Aktionenhttps://wizard-framework.dev.java.net/>> <<gelernt.->> <<Wernoch>> <<alsoein>> <<wissenFramework,>> <<will,aber>> <<wieohne>> <<besondereDoku,>> <<Eventsohne>> <<wieDownload,>> <<z.B.nur>> <<Cursortasten,ein>> <<TAB,CVS>> <<oder(letzter>> <<auchEintrag>> <<Mausaktionen2007)>> <<zugeordnetund>> <<werden,eine>> <<sollte[Javadoc-API|http://pietschy.org/software/wizard-framework/api/]>> <<einfachauf>> <<imeinem>> <<ganzanderen>> <<normalenServer



==
>> <<[JavaTutorial|http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html])fündigsonstige>> <<nachlesen.Seiten>> <<Dortzum>> <<istThema>> <<==

* http://tips4java.wordpress.com/ - Blog mit
>>sehr <<gutvielen>> <<erklärt,hochinteressanten>> <<wasTips>> <<eszu>> <<Swing
* http://developerlife.com/tutorials/?tag=swingx - Sammlung von Artikeln
>>mit <<~InputMapeinigem>> <<undzum>> <<~ActionMapThema>> <<aufSwingX

In
>> <<sichdiesem>> <<hat.Wiki sind die folgenden Seiten mit dem Schlagwort [Swing] markiert:\\
<<[{HasTagOf Swing}]

----
[{Tag Java Swing}]