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 Anderedie>> <<MenschenNachwelt>> und für mich zu <<erhaltenerhalten,>> <<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. <<IdeenIch>> <<hierzumöchte>> <<findenjeden>> <<sichUnterschied,>> <<auf >>der <<Seitemich>> <<JTableAlsSpreadsheet.


==
stört,
>> <<Zuordnunghierbei>> <<voneinzeln>> <<Tastenfunktionen ==behandeln.>>

<<In===>> <<einersofortiges>> <<Tabellelöschen>> <<hattebeim>> <<icheditieren>> <<damit gekämpft, daß man mit TAB nicht in die nächste Tabellenzelle kam. Der Fehler lag ganz woanders, aber ich habe etwas über die Zuordnung von Tasten zu Aktionen gelernt. Wer also wissen will, wie besondere Events wie z.B. Cursortasten, TAB, oder auch Mausaktionen zugeordnet werden, sollte einfach im ganz normalen [JavaTutorial|http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html])fündig nachlesen. Dort ist sehr gut erklärt, was es mit ~InputMap und ~ActionMap auf sich hat.===>>

<<
==
Wenn
>> <<Actionsman>> <<==

Das [Action|http://java.sun.com/javase/6/docs/api/javax/swing/Action.html]-Interface ist eigentlich
>>eine <<rechtTextzelle>> <<gute(z.B.>> <<Grundidee.mit>> <<Eineder>> <<vonMaus)>> <<einemaktiviert>> <<Programmhat>> <<ausführbare Funktion wird abstrahiert als Action verpackt >>und <<kann >>dann <<z.B. einem Button und/oder einem Menü zugeordnet werden. Leider reicht die Implementation der Standard-Klassen vorne und hinten nicht aus, um komfortabel zu arbeiten. Auf der Seite JavaActions werden einige Aspekte von Actions diskutiert.


== Zelle in einer Tabelle aktiveren ==

Wer durch ein Programm (also nicht durch anklicken)
>>eine <<Zellealphanumerische>> <<aktivierenTaste>> <<will,drückt,>> <<musswird>> <<sichdiese>> <<genauTaste>> <<überlegen,an>> <<was er denn nun will. Es gibt die Selektion der Tabelle und >>das <<Feld,Ende>> <<aufdes>> <<dembestehenden>> <<derTextes>> <<TAB-Focusangefügt.>> <<liegt und dann kann es noch einen geöffneten Editor (mit und ohne Tastatur-Focus) geben. All dies sind komplett unterschiedliche Dinge. >>Das <<Ergebnis,gleiche>> <<daspassiert>> <<manbeim>> <<amDrücken>> <<ehestenvon>> <<erwartetF2.>> <<(dasIn>> <<demOOo>> <<KlickCalc>> <<mit der Maus am ehesten entspricht), gibt meines Erachtens nach folgender Code:

{{{
 table.requestFocusInWindow();
 table.editCellAt(2, 2);
 table.changeSelection(2, 2, false, false);
}}}
mit den folgenden Befehlen wird die Selektion verändert:
{{{
 table.getSelectionModel().setLeadSelectionIndex(2);
 table.getColumnModel().getSelectionModel().setLeadSelectionIndex(2);
 table.getSelectionModel().setAnchorSelectionIndex(2);
 table.getColumnModel().getSelectionModel().setAnchorSelectionIndex(2);
}}}
evtl.
>>ist <<das hier dann auch noch hilfreich:
{{{
 table.scrollRectToVisible(table.getCellRect(2, 2, true));
}}}

== richtig grosse Listen anzeigen ==

Das ~ListModel kann prinzipiell auch mit richtig grossen Listen umgehen. Dabei gibt
>>es <<allerdingsso,>> <<ein paar Tricks. Zum einen sollte man mit setPrototypeCellValue() einen Wert mit maximaler Ausgabegröße setzen, um zu verhindern, >>daß beim <<Erstelleneinfachen>> <<desDrücken>> <<Widgetsder>> <<allebestehende>> <<ElementeWert>> <<testweiseimmer>> <<gezeichnetüberschrieben>> <<werden,wird>> <<umund>> <<das Größte zu finden.

Ein paar zusätzliche Schwierigkeiten ergeben sich, wenn
>>man <<eineF2>> <<richtigdrücken>> <<grossemuss,>> <<Liste in einer ~ComboBox verwenden will, insbesondere wenn die Zugriff auf die Elemente langsam ist (z.B. aus einer Datenbank). Hier werden an mehreren Stellen Schleifen verwendet, >>um <<relativ simple Aufgaben zu lösen. Um das zu umgehen, müssen ein paar Methoden überladen und ein bisschen gehackt werden. Das würde allerdings hier >>den <<RahmenWert>> <<sprengen.editieren>> <<Wer eine Datenbank-taugliche Lösung sucht, kann mich fragen, ich habe hierfür eine abgeleitete Variante der ~ComboBox, die ich mit tausenden von Einträgen benutze.  -- ThomasBayen



== ~JComboBox mit Autocompletion ==

Für richtig grosse Listen ist es dann auch sinnvoll, diese ordentlich durchsuchen
>>zu können.<< Dazu bedarf es einer Autovervollständigung (wie z.B. im Firefox URL-Feld). Ich habe etwas gegoogelt und Ansätze hierzu unter folgenden Links gefunden:>>

<<*Dieses>> <<http://today.java.net/pub/a/today/2007/07/19/adding-auto-completion-to-swing-comboboxes.htmlProblem>> <<-ist>> <<Artikelaufgrund>> <<zum Vergleich mehrerer Lösungen (von 2007)
* http://www.orbital-computer.de/JComboBox/ - Artikel von Thomas Bierhance,
>>der <<genauStruktur>> <<erklärt, wie es gemacht wird (von 2004)
* https://swinglabs.org/ enthält im ~SwingX-Projekt eine sauber aufgebaute Lösung
* http://www.java.happycodings.com/Java_Swing/code6.html - einfaches, undokumentiertes Beispiel
* http://snippets.dzone.com/posts/show/7633 - einfaches, undokumentiertes Beispiel

Swinglabs enthält Projekte von Sun, die potentiell in das nächste Java aufgenommen werden könnten. Das bedeutet, die dortige Lösung ist ganz gut dokumentiert, in eine ordentliche API zerlegt und integriert sich sauber mit Swing. Das ist im Prinzip die sauberste Lösung, die ich bisher gefunden habe. Leider unterstützt sie kein Filtern
>>der <<Liste.

Der
JTable-Klasse
>> <<obengenanntegar>> <<[Artikelnicht>> <<vonso>> <<Thomastrivial,>> <<Bierhance|http://www.orbital-computer.de/JComboBox/] scheint sowas >>wie <<dieich>> <<Mutterdachte.>> <<allerDeshalb>> <<Autocompletion-Lösungendokumentiere>> <<zuich>> <<sein.hier>> <<Alleeinen>> <<scheinenTeil>> <<mehr oder 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 >>des <<ArtikelsWeges,>> <<auch meine Gedanken über grosse Listen und die Performance-Probleme gemacht. Er hast >>den <<gleichen Bug gefunden wie >>ich <<undzu>> <<ihnmeiner>> <<auchLösung>> <<pergenommen>> <<Reflectionhabe,>> <<gelöst.um>> <<Wasggf.>> <<michspäter>> <<dabeibeim>> <<aufnachbessern>> <<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 <<insalles>> <<JDK bekommen hat. Also durfte ich mal wieder das Rad >>neu <<erfinden.suchen>> <<-- ThomasBayen



=== noch
>>zu <<lösende Probleme ===müssen:>>

<<LeiderZuerstmal>> <<unterstützensteht>> <<vieleim>> <<Lösungen[Swingwiki|http://www.swingwiki.org/best:edit_cells_like_excel],>> <<das Filtern nicht, deshalb hier nochmal zur Erklärung: Wenn ich den Anfang eines Begriffes eingebe, mächte ich, >>daß <<in der Liste darunter nur noch >>die <<Einträgeeine>> <<stehen,Lösung>> <<diehätten.>> <<zuDiese>> <<meinemLösung>> <<Anfangbasiert>> <<passendarauf,>> <<(wiedaß>> <<imein>> <<Firefox).~DefaultCellEditor>> <<Diegesetzt>> <<Swinglabs-Lösungwird,>> <<z.B.der>> <<lässtsich>> <<diebeim>> <<ListeAufruf>> <<wie sie ist, geht aber >>automatisch <<zumkomplett>> <<erstenselektiert.>> <<Eintrag,Das>> <<derhilft>> <<passt.zwar,>> <<Obwenn>> <<noch weitere passen könnten, sehe >>ich <<nicht (wenn die nicht direkt untereinander stehen).

Neben dem Filtern sind meine Anforderungen noch: Der Umgang mit richtig grossen Listen (also
>>eine <<API,alphanumerische>> <<inTaste>> <<diedrücke,>> <<ichselektiert>> <<Datenbankzugriffeaber>> <<reinschreibenbei>> <<kann)F2>> <<sowieebenfalls>> <<dieden>> <<Möglichkeit,gesamten>> <<dieText>> <<Trefferfunktionund>> <<selberverhindert>> <<bestimmensomit,>> <<zudas>> <<könnenman>> <<(alsoeinen>> <<nichtvorhandenen>> <<nurZelleninhalt>> <<Sucheeditieren>> <<nach dem Anfang des Strings, sondern eine eigene Funktion z.B. für reguläre Ausdrücke etc).kann.>>

<<:In>> <<evtl.einem>> <<ist[Sun-Forum|http://forums.sun.com/thread.jspa?forumID=57&threadID=752727]>> <<dassteht>> <<Buch 'Swing Hacks' >>ein <<guterQuelltext,>> <<Hinweis.von>> <<JavaBooklist.dem>> <<



==
ich
>> <<Optimierungüberhaupt>> <<desnicht>> <<Zeichnensverstehe,>> <<unter Swing ==

Wer wissen will, wie in Swing
>>was <<warum in welcher Methode gezeichnet wird und wer mehr über paint(), repaint(), update(), doubleBuffered, opaque und solche Sachen erfahren möchte, als er jemals wissen wollte, sollte diesen Artikel lesen:

http://java.sun.com/products/jfc/tsc/articles/painting/

Wer wissen will, was sein Programm so treibt, kann dazu http://freedesktop.org/wiki/Software/Xephyr benutzen. Das ist ein Xnest-ähnlicher X-Server,
>>der <<insoll.>> <<einemIch>> <<Fensterhabe>> <<arbeitet.ihn>> <<Ernicht>> <<hatausprobiert,>> <<einennach>> <<Debug-Mode, >>der <<einemBeschreibung>> <<anzeigt,sollte>> <<wanner>> <<wasaber>> <<gezeichnetmit>> <<wird.meinem>> <<DasProblem>> <<hilft dabei, mehrfache und unnötige refresh-Durchläufe >>zu <<finden.


==
tun
>> <<disablen (ausgrauen) eines ganzen JPanel ==haben.>>

<<WennIn>> <<man ein komplexes Widget aus mehreren Unterwidgets aufgebaut hat (z.B. ein Eingabeformular), will man dieses in manchen Fällen schon mal ausser Betrieb setzen. Mit >>einem <<einzelnen[Artikel|http://www.informit.com/articles/article.aspx?p=24130&seqNum=11]>> <<Eingabefeldmit>> <<wie >>einem <<[JTextField|http://java.sun.com/javase/6/docs/api/javax/swing/JTextField.html]relativ>> <<machteinfachen>> <<manNiveau>> <<dasfand>> <<durchich>> <<einenden>> <<AufrufHinweis,>> <<vonwie>> <<[setEnabled(boolean)|http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#setEnabled(boolean)].Funktionstasten>> <<Manund>> <<setztalphanumerische>> <<damitTasten>> <<aberüberhaupt>> <<immerbehandelt>> <<nurwerden>> <<das aktuell angesprochene Widget ausser Kraft >>und <<nichtwo>> <<seineder>> <<Tochterwidgets.

Dieses
Unterschied
>> <<Problemliegt:>> <<istScheinbar>> <<rechtwird>> <<schwierigin>> <<zu~BasicTableUI>> <<lösen,entschieden,>> <<weilob>> <<Sun >>es <<scheinbar "vergessen" hat. Im groben gibt es zwei Methoden:

* rekursives dis-/enablen aller Tochterwidgets. Dabei ist zu beachten, daß es auch Widgets geben kann, die aus anderen Gründen bereits disabled sind. Diese muss man
>>sich <<merken, >>um <<die richtigen später wieder zu enablen. In den meisten Fällen sollte das >>eine <<ordentlicheeinzufügende>> <<LösungTaste>> <<ergeben.oder>> <<Haben sich die Tochterwidgets in der Zwischenzeit jedoch verändert, gibt das völliges Chaos und ist nicht praktikabel. Ein Beispiel für >>eine <<solcheSondertaste>> <<Lösung(z.B.>> <<findetPfeiltaste>> <<sichoder>> <<unterF2)>> <<http://tips4java.wordpress.com/2009/08/02/disabled-panel/

*
handelt.
>> <<ManF2>> <<erzeugtwird>> <<einedann>> <<Artin>> <<Glasspane,~BasicTableUI.actionPerformed>> <<dieals>> <<manAction>> <<überSTART_EDITING>> <<dasbehandelt,>> normale <<WidgetTasten>> <<legtin>> <<und die es "ausgraut". Ausserdem muss man noch die Tastatur-Lsitener abschalten sowie das Widget und seine Töchter aus dem Focus-Traversal herausnehmen.~JTable.processKeyBinding().>>
<<**
Parallel
>> <<Einefand>> <<solcheich>> <<Lösungin>> <<gehteinem>> <<mit[Forumsthread>> <<demzum>> <<[JXLayer|https://jxlayer.dev.java.net/].Thema|http://forums.java.net/jive/thread.jspa?threadID=42682&tstart=0]>> <<Diesereinen>> <<stelltBeitrag>> <<einevon>> <<zusätzliche"oswald",>> <<Schichtder>> <<zwischenversucht>> <<demhatte,>> <<Benutzer~processKeyBinding()>> <<undzu>> <<demüberladen,>> <<Widgetaber>> <<dar, >>mit <<derdieser>> <<manIdee>> <<allesnicht>> <<möglichevorwärtsgekommen>> <<machenwar.>> <<kann,Nachdem>> <<unterich>> <<anderem auch >>das <<Widgetdurchdacht>> <<ausgrauenhatte,>> <<undmerkte>> <<deaktivieren.ich,>> <<Interessanterweise ist das Ding so toll, >>daß <<ichdieser>> <<nochGedanke>> <<nichtder>> <<malbeste>> <<einwar,>> <<simples ausgrauen hinbekommen habe. :-) Stattdessen gibt es einen Blur-Effekt, >>den ich <<ausgesehen>> <<einerhatte.>> <<Bildbearbeitungs-BibliothekIch>> <<nehmenbeschäftigte>> <<musste.
**
mit
>> <<Unterintensiver>> <<http://tips4java.wordpress.com/2009/08/02/disabled-panel/mit>> <<gibtdieser>> <<esMethode,>> <<hierzufand>> <<auchdas>> <<eineProblem,>> <<etwasdas>> <<bodenständigereoswald>> <<Lösung,hatte,>> <<dieeinen>> <<ausWorkaround>> <<dreihierfür>> <<Java-Klassen besteht, die gut erklärt sind >>und <<derenhabe>> <<Funktionsweisefolgende>> <<manLösung>> <<schnellimplementiert:
{{{
public
>> <<verstehenclass>> <<kann.SpreadsheetJTable>> <<Jeextends>> <<nachJTable>> <<Look&Feel{

protected
>> <<ergibtboolean>> <<sichprocessKeyBinding(KeyStroke>> <<eineks,>> <<etwasKeyEvent>> <<seltsame Farbe beim ausgrauen, die man im Quelltext aber einfach anpassen kann (statt der Suche im L&F einfach "Color(255,255,255)" nehmen).e,>>
<<


==
int
>> <<Hängercondition,>> <<beimboolean>> <<Debuggingpressed)>> <<in einer ~JComboBox =={>>
<< /*>>
<<Falls >> <<man,*>> <<z.B.Der>> <<mitInhalt>> <<Eclipsedieses>> <<Codeif-Blocks>> <<debuggenist>> <<will,aus>> der <<innerhalbsuper-Methode>> <<derentnommen.>> <<Render-RoutineIch
>> <<einer*>> <<~JComboBoxerzeuge>> <<läuft,hier>> <<kann das zu Problemen führen. Das gilt z.B. für >>die <<ImplementierungEditor-Komponente>> <<einesgenauso>> <<eigenenwie>> <<~JComboBoxModelim>> <<oderOriginal.>> <<fürDann
>> <<diverse*>> <<Listener,selektiere>> <<dieich>> <<dortallerdings>> <<aufgerufen werden könnten. Zum Beginn des Zeichnens der Cmobobox sperrt Swing scheinbar aus irgendeinem Grund >>den <<X-Server.ganzen>> <<HältText>> <<derwie>> <<Debuggerin
>> <<das*>> <<ProgrammSpreadsheet-Applikationen>> <<nunüblich.
>> <<an*/
if
>> <<der(condition>> <<flaschen==>> <<StelleWHEN_ANCESTOR_OF_FOCUSED_COMPONENT
&&
>> <<an,isFocusOwner()
&&
>> <<so!Boolean.FALSE
.equals((Boolean)
>> <<hängtgetClientProperty("JTable.autoStartsEdit")))>> <<der ganze X-Server. :-({>>
<<
Kurzfristige
//
>> <<AbhilfeWe>> <<schafftdo>> <<hiernot>> <<dashave>> <<Einloggena>> <<aufbinding>> <<derfor>> <<Textkonsolethe>> <<undevent.
Component
>> <<eineditorComponent>> <<schnelles=>> <<"{{killallgetEditorComponent();
if
>> <<java}}",(editorComponent>> <<da==>> <<dernull)>> <<X-Server{
//
>> <<nichtOnly>> <<wirklichattempt>> <<abgestürzt,to>> <<sonderninstall>> <<ebenthe>> <<nureditor>> <<gesperrton>> <<ist.a>> <<AberKEY_PRESSED,
if
>> <<damit(e>> <<ist==>> <<dasnull>> <<Debugging-Problem||>> <<jae.getID()>> <<immer!=>> <<nochKeyEvent.KEY_PRESSED)>> <<nicht{
return
>> <<gelöst.false;>>
<< }>>
<<=== //>> <<LösungDon't>> <<1start>> <<===

Wer
when
>> <<alsojust>> <<solchena>> <<Codemodifier>> <<wirklichis>> <<debuggenpressed
int
>> <<muss,code>> <<kann=>> <<ese.getKeyCode();
if
>> <<mit(code>> <<einem==>> <<zweitenKeyEvent.VK_SHIFT>> <<X-Server||>> <<socode>> <<wie==>> <<ichKeyEvent.VK_CONTROL
||
>> <<machen:code>> <<Ich==>> <<habeKeyEvent.VK_ALT)>> <<mit{>>
<<
return
>> << Xephyr :1false;>>
<< }>>
<<einen //>> <<eigenenTry>> <<"X-Serverto>> <<iminstall>> <<Fenster"the>> <<füreditor
int
>> <<meinleadRow>> <<Programm=>> <<gestartetgetSelectionModel().getLeadSelectionIndex();
int
>> <<(sollteleadColumn>> <<mit=>> <<"Xnest" auch gehen). Dann bin ich in die Eclipse Startkonfiguration gegangen und habe dort im "Environment" den Wert "DISPLAY" auf ":1" gesetzt. Nun läuft mein Programm innerhalb des Xephyr-Fensters und hängt auch nur diesen auf. Eclipse (im normalen X-Server) ist aber weiterhin noch bedienbar und kann wunderbar zum Debuggen benutzt werden.getColumnModel().getSelectionModel()>>
<< .getLeadSelectionIndex();>>
<<Übrigens if>> <<bin(leadRow>> <<ich!=>> <<auf-1>> <<dieses&&>> <<ProblemleadColumn>> <<schon!=>> <<vor-1>> <<einiger&&>> <<Zeit!isEditing())>> <<gestossen.{
if
>> <<Damals(!editCellAt(leadRow,>> <<hatteleadColumn,>> <<iche))>> <<mir{
return
>> <<notiert, daß ein Aufruf von "{{setLightWeightPopupEnabled(false);}}" auf der ~JComboBox auch hilft. Tat es jetzt aber nicht mehr. Vielleicht hängt das von den Umständen ab und ist im Zweifelsfall auch einen Versuch wert.false;>>
<< }>>
<<Unter }
editorComponent
>> <<Umständen=>> <<kanngetEditorComponent();
if
>> <<man(editorComponent>> <<mit==>> <<"exportnull)>> <<DISPLAY=:1;{
return
>> <<metacity &" auch den Gnome Fenstermanager im Xephyr-Server starten, bevor man sein Java-Programm startet. Das erlaubt eine bessere Bedienung der Java-Fenster. -- ThomasBayenfalse;>>
<< }>>
<<=== //>> <<Lösung 2 ===-TB->>
<<
Nach
//
>> <<einigemselect>> <<Googleneverything>> <<habe(like>> <<ichSpreadsheet>> <<herausgefunden,Apps>> <<daßdo)
if
>> <<ich(editorComponent>> <<nichtinstanceof>> <<derJTextField)>> <<einzige{
((JTextField)
>> <<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 editorComponent).selectAll();>>
<< }>>
<<  -Dsun.awt.disablegrab=true }>>
<< }>>
<<als boolean>> <<VM-ParameterretValue>> <<das=>> <<Problemsuper.processKeyBinding(ks,>> <<auche,>> <<umgehen.condition,>> <<''(Ichpressed);
return
>> <<frage mich zwar, wenn jemand einen Schalter dafür eingebaut hat, warum der nicht immer eingeschaltet ist, aber was solls...)''retValue;>>
<< }>>

<<}>>
<<== Wizards programmieren ==>>
<<}}}>>
<<Ein
Das
>> <<jederErgebnis>> <<hatist>> <<wohljetzt,>> <<schondas>> <<mal einen Wizard bedient, z.B. in der Forma als einen Installer. Da kommt natürlich die Frage auf, wie >>man <<sowaseinerseits>> <<selbermit>> <<programmiereneiner>> <<kann.normalen>> <<EsTaste>> <<gehtden>> <<dabeiZellinhalt>> <<zumeistüberschreibt,>> <<umaber>> <<eineandererseits>> <<Abfolgemit>> <<vonF2>> <<Seiten,auch>> <<in denen man Eingaben tätigen kann. Diese werden ggf. überprüft und abhängig von >>den <<Eingabenvorhandenen>> <<kommtInhalt>> <<maneditieren>> <<aufkann!>> <<andere-->> <<Seiten oder nicht. Am Ende drückt man "Finish" und dann spätestens geschieht irgendetwas. Ich habe hier mal eine Sammlung von Links zum Thema aufgeführt:ThomasBayen>>

<<* [Creating Wizard Dialogs with Java Swing|http://java.sun.com/developer/technicalArticles/GUI/swing/wizard/] - Artikel von Sun, der zeigt, wie man es "von Hand" machen kann.>>
<<*===>> <<https://wizard.dev.java.netNavigation>> <<-durch>> <<WizardTAB-Taste>> <<API aus den [SwingLabs|https://swinglabs.dev.java.net/], bzw. von Sun-Mitarbeiter Tim Boudreau===>>
<<** [using the Wizards API|http://today.java.net/article/2006/02/24/using-wizard-api] - Artikel der Entwickler dieses Projektes>>
<<**Beim>> <<[ZauberhafteDrücken>> <<Dialoge|http://www.heise.de/ix/artikel/Zauberhafte-Dialoge-506947.html]von>> <<-TAB>> <<'''deutscher'''sollte>> <<Artikelin>> <<aus der iX
** [Javaworld-Artikel|http://www.javaworld.com/javaworld/jw-04-2008/jw-04-opensourcejava-wizard-api.html] - ebenfalls über
>>die <<Wizardjeweils>> <<API
*
nächste
>> <<[JavaZelle>> <<Wizardgewechselt>> <<Framework|http://sourceforge.net/projects/jwf]werden.>> <<(JWF)Nachdem>> <<-ich>> <<ältereseine>> <<Projekt,Weile>> <<wirddurch>> <<auchden>> <<gelobt,Sourcecode>> <<letzte Version allerdings >>von <<2002
*
~BasicTableUI
>> <<[CJWizard|http://code.google.com/p/cjwizard/]gestreift>> <<-bin>> <<neueresund>> <<Projekt.gemerkt>> <<Derhabe,>> <<Autor sagt, >>daß <<er auf der Wizard API aufbaut und >>es <<bessernicht>> <<gemachtso>> <<hat.viel>> <<scheintbringt,>> <<ein aktives Projekt zu sein
** http://code.google.com/p/cjwizard/wiki/QuickStartGuide - kurze Einführung
>>in <<dieseden>> <<Bibliothek
*
dortigen
>> <<https://wizard-framework.dev.java.net/Actions>> <<-herumzuhacken,>> <<nochhabe>> <<einich>> <<Framework,mich>> <<aberzurückgelehnt,>> <<ohneetwas>> <<Doku,gegoogelt>> <<ohne Download, nur ein CVS (letzter Eintrag 2007) >>und <<einebin>> <<[Javadoc-API|http://pietschy.org/software/wizard-framework/api/]dann>> <<aufim>> <<einemganz>> <<anderennormalen>> <<Server



==
[Java-Tutorial|file:///home/tbayen/Daten/Dokumentationen_dontbackup/JavaTutorial-Nov06/uiswing/misc/keybinding.html]
>> <<sonstigefündig>> <<Seitengeworden.>> <<zumDort>> <<Themaist>> <<==

* http://tips4java.wordpress.com/ - Blog mit
>>sehr <<vielengut>> <<hochinteressantenerklärt,>> <<Tipswas>> <<zues>> <<Swing
* http://developerlife.com/tutorials/?tag=swingx - Sammlung von Artikeln
>>mit <<einigem~InputMap>> <<zumund>> <<Thema~ActionMap>> <<SwingX

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

----
[{Tag Java Swing}]