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>> <<===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
==
>> <<manActions>> <<==

Das [Action|http://java.sun.com/javase/6/docs/api/javax/swing/Action.html]-Interface ist eigentlich
>>eine <<Textzellerecht>> <<(z.B.gute>> <<mitGrundidee.>> <<derEine>> <<Maus)von>> <<aktivierteinem>> <<hatProgramm>> <<ausführbare Funktion wird abstrahiert als Action verpackt >>und <<kann >>dann <<einez.B.>> <<alphanumerischeeinem>> <<TasteButton>> <<drückt,und/oder>> <<wirdeinem>> <<dieseMenü>> <<Tastezugeordnet>> <<anwerden.>> <<dasLeider>> <<Endereicht>> <<desdie>> <<bestehendenImplementation>> <<Textesder>> <<angefügt.Standard-Klassen>> <<Dasvorne>> <<gleicheund>> <<passierthinten>> <<beimnicht>> <<Drückenaus,>> <<um komfortabel zu arbeiten. Auf der Seite JavaActions werden einige Aspekte >>von <<F2.Actions>> <<Indiskutiert.


==
>> <<OOoZelle>> <<Calcin>> <<isteiner>> <<esTabelle>> <<so,aktiveren>> <<daß==

Wer
>> <<beimdurch>> <<einfachenein>> <<DrückenProgramm>> <<(also nicht durch anklicken) eine Zelle aktivieren will, muss sich genau überlegen, was er denn nun will. Es gibt die Selektion >>der <<bestehendeTabelle>> <<Wertund>> <<immerdas>> <<überschriebenFeld,>> <<wirdauf>> <<dem der TAB-Focus liegt >>und <<dann kann es noch einen geöffneten Editor (mit und ohne Tastatur-Focus) geben. All dies sind komplett unterschiedliche Dinge. Das Ergebnis, das >>man <<F2am>> <<drückenehesten>> <<muss,erwartet>> <<um(das>> <<dem Klick 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 <<Wertfolgenden>> <<editierenBefehlen>> <<zuwird>> <<können.die Selektion verändert:>>
<<{{{>>
<<Dieses>> <<Problem table.getSelectionModel().setLeadSelectionIndex(2);
>> << table.getColumnModel().getSelectionModel().setLeadSelectionIndex(2);
 table.getSelectionModel().setAnchorSelectionIndex(2);
 table.getColumnModel().getSelectionModel().setAnchorSelectionIndex(2);
}}}
evtl.
>>ist <<aufgrunddas>> <<derhier>> <<Strukturdann>> <<derauch>> <<JTable-Klassenoch>> <<garhilfreich:
{{{
>> <<nicht table.scrollRectToVisible(table.getCellRect(2,>> <<so2,>> <<trivial,true));
}}}

==
>> <<wierichtig>> <<ichgrosse>> <<dachte.Listen>> <<Deshalbanzeigen>> <<dokumentiere==

Das
>> <<ich~ListModel>> <<hierkann>> <<prinzipiell auch mit richtig grossen Listen umgehen. Dabei gibt es allerdings ein paar Tricks. Zum >>einen <<Teilsollte>> <<desman>> <<Weges,mit>> <<densetPrototypeCellValue()>> <<icheinen>> <<zuWert>> <<meinermit>> <<Lösungmaximaler>> <<genommenAusgabegröße>> <<habe,setzen,>> um <<ggf.zu>> <<späterverhindern,>> <<daß >>beim <<nachbessernErstellen>> <<nichtdes>> <<allesWidgets>> <<neualle>> <<suchenElemente>> <<testweise gezeichnet werden, um das Größte >>zu <<müssen:finden.>>

<<ZuerstmalEin>> <<stehtpaar>> <<imzusätzliche>> <<[Swingwiki|http://www.swingwiki.org/best:edit_cells_like_excel],Schwierigkeiten>> <<daßergeben>> <<diesich,>> <<wenn man >>eine <<Lösungrichtig>> <<hätten.grosse>> <<DieseListe>> <<Lösungin>> <<basierteiner>> <<darauf,~ComboBox>> <<daßverwenden>> <<einwill,>> <<~DefaultCellEditorinsbesondere>> <<gesetztwenn>> <<wird,die>> <<derZugriff>> <<sichauf>> <<beimdie>> <<AufrufElemente>> <<automatischlangsam>> <<komplettist>> <<selektiert.(z.B.>> <<Dasaus>> <<hilfteiner>> <<zwar,Datenbank).>> <<wennHier>> <<ichwerden>> <<einean>> <<alphanumerischemehreren>> <<TasteStellen>> <<drücke,Schleifen>> <<selektiertverwendet,>> <<aberum>> <<beirelativ>> <<F2simple>> <<ebenfallsAufgaben>> <<denzu>> <<gesamtenlösen.>> <<TextUm>> <<unddas>> <<verhindertzu>> <<somit,umgehen,>> <<dasmüssen>> <<manein>> <<einenpaar>> <<vorhandenenMethoden>> <<Zelleninhaltüberladen>> <<editierenund>> <<kann.

In
ein
>> <<einembisschen>> <<[Sun-Forum|http://forums.sun.com/thread.jspa?forumID=57&threadID=752727]gehackt>> <<stehtwerden.>> <<einDas>> <<Quelltext,würde>> <<vonallerdings>> <<demhier>> <<ichden>> <<überhauptRahmen>> <<nichtsprengen.>> <<verstehe,Wer>> <<waseine>> <<derDatenbank-taugliche>> <<soll.Lösung>> <<Ichsucht,>> <<kann mich fragen, ich >>habe <<ihnhierfür>> <<nichteine>> <<ausprobiert,abgeleitete>> <<nachVariante>> der <<Beschreibung~ComboBox,>> <<solltedie>> <<erich>> <<aber >>mit <<meinemtausenden>> <<Problemvon>> <<zuEinträgen>> <<tunbenutze.>> <<haben. -- ThomasBayen>>

<<In

==
>> <<einem~JComboBox>> <<[Artikel|http://www.informit.com/articles/article.aspx?p=24130&seqNum=11] >>mit <<einemAutocompletion>> <<relativ==

Für
>> <<einfachenrichtig>> <<Niveaugrosse>> <<fandListen>> <<ichist>> <<denes>> <<Hinweis,dann>> <<wieauch>> <<Funktionstastensinnvoll,>> <<unddiese>> <<alphanumerischeordentlich>> <<Tastendurchsuchen>> <<überhauptzu>> <<behandeltkönnen.>> <<werdenDazu>> <<bedarf es einer Autovervollständigung (wie z.B. im Firefox URL-Feld). Ich habe etwas gegoogelt >>und <<woAnsätze>> <<derhierzu>> <<Unterschiedunter>> <<liegt:folgenden>> <<ScheinbarLinks>> <<wirdgefunden:

*
>> <<inhttp://today.java.net/pub/a/today/2007/07/19/adding-auto-completion-to-swing-comboboxes.html>> <<~BasicTableUI->> <<entschieden,Artikel>> <<obzum>> <<Vergleich mehrerer Lösungen (von 2007)
* http://www.orbital-computer.de/JComboBox/ - Artikel von Thomas Bierhance, der genau erklärt, wie
>>es <<sichgemacht>> <<umwird>> <<eine(von>> <<einzufügende2004)
*
>> <<Tastehttps://swinglabs.org/>> <<oderenthält>> <<im ~SwingX-Projekt >>eine <<Sondertastesauber>> <<(z.B.aufgebaute>> <<PfeiltasteLösung
*
>> <<oderhttp://www.java.happycodings.com/Java_Swing/code6.html>> <<F2)->> <<handelt.einfaches,>> <<F2undokumentiertes>> <<wirdBeispiel
*
>> <<dannhttp://snippets.dzone.com/posts/show/7633>> <<- einfaches, undokumentiertes Beispiel

Swinglabs enthält Projekte von Sun, die potentiell
>>in <<~BasicTableUI.actionPerformeddas>> <<alsnächste>> <<ActionJava>> <<START_EDITINGaufgenommen>> <<behandelt,werden>> <<normalekönnten.>> <<TastenDas>> <<bedeutet, die dortige Lösung ist ganz gut dokumentiert, >>in <<~JTable.processKeyBinding().

Parallel
eine
>> <<fandordentliche>> <<API zerlegt und integriert sich sauber mit Swing. Das ist im Prinzip die sauberste Lösung, die >>ich <<inbisher>> <<einemgefunden>> <<[Forumsthreadhabe.>> <<zumLeider>> <<Thema|http://forums.java.net/jive/thread.jspa?threadID=42682&tstart=0]unterstützt>> <<einensie>> <<Beitragkein>> <<Filtern der Liste.

Der obengenannte [Artikel
>>von <<"oswald",Thomas>> <<derBierhance|http://www.orbital-computer.de/JComboBox/]>> <<versuchtscheint>> <<hatte,sowas>> <<~processKeyBinding()wie>> <<die Mutter aller Autocompletion-Lösungen >>zu <<überladen,sein.>> <<aberAlle>> <<mitscheinen>> <<diesermehr>> <<Ideeoder>> <<nichtweniger>> <<vorwärtsgekommenbei>> <<war.ihm>> <<Nachdemabgeschrieben>> <<ichzu>> <<dashaben.>> <<durchdachtDieser>> <<hatte,Artikel>> <<merkteist>> <<ich,sehr>> <<daßgut>> <<diesergeschrieben>> <<Gedankeund>> <<erklärt Schritt für Schritt, wie man sowas macht. Schön zu lesen, wenn man einfach mal einem, >>der <<bestesich>> <<war,in>> <<Swing auskennt, über die Schulter schauen möchte. Im übrigen hat er sich am Ende des Artikels auch meine Gedanken über grosse Listen und die Performance-Probleme gemacht. Er hast >>den <<gleichen Bug gefunden wie >>ich <<gesehenund>> <<hatte.ihn>> <<Ichauch>> <<beschäftigteper>> <<mitReflection>> <<intensivergelöst.>> <<mitWas>> <<mich dabei auf die Palme bringt, ist, daß >>dieser <<Methode,Artikel>> <<fandseit>> <<das2004>> <<Problem,im>> <<dasNetz>> <<oswaldsteht,>> <<hatte,offensichtlich>> <<einensogar>> <<Workaroundirgendjemand>> <<hierfüraus>> <<Suns ~SwingX-Team ihn wahrgenommen >>und <<habedaran>> <<folgendeherumgebastelt>> <<Lösunghat>> <<implementiert:und Sun/Oracle sowas bis heute nicht ins JDK bekommen hat. Also durfte ich mal wieder das Rad neu erfinden. -- ThomasBayen>>
<<{{{>>
<<public

===
>> <<classnoch>> <<SpreadsheetJTablezu>> <<extendslösende>> <<JTableProbleme>> <<{===>>

<< protectedLeider>> <<booleanunterstützen>> <<processKeyBinding(KeyStrokeviele>> <<ks,Lösungen>> <<KeyEventdas>> <<e,
int
Filtern
>> <<condition,nicht,>> <<booleandeshalb>> <<pressed)hier>> <<{
/*
nochmal
>> <<*zur>> <<DerErklärung:>> <<InhaltWenn>> <<diesesich>> <<if-Blocksden>> <<istAnfang>> <<auseines>> <<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
>> <<*/
if
automatisch
>> <<(conditionzum>> <<==ersten>> <<WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
&&
Eintrag,
>> <<isFocusOwner()
&&
der
>> <<!Boolean.FALSE
.equals((Boolean)
passt.
>> <<getClientProperty("JTable.autoStartsEdit")))Ob>> <<{
//
noch
>> <<Weweitere>> <<dopassen>> <<notkönnten,>> <<havesehe>> <<aich>> <<bindingnicht>> <<for(wenn>> <<thedie>> <<event.
Component
nicht
>> <<editorComponentdirekt>> <<=untereinander>> <<getEditorComponent();stehen).>>
<< if
Neben
>> <<(editorComponentdem>> <<==Filtern>> <<null)sind>> <<{
//
meine
>> <<OnlyAnforderungen>> <<attemptnoch:>> <<toDer>> <<installUmgang>> <<themit>> <<editorrichtig>> <<ongrossen>> <<aListen>> <<KEY_PRESSED,
if
(also
>> <<(eeine>> <<==API,>> <<nullin>> <<||die>> <<e.getID()ich>> <<!=Datenbankzugriffe>> <<KeyEvent.KEY_PRESSED)reinschreiben>> <<{
return
kann)
>> <<false;
}
//
sowie
>> <<Don'tdie>> <<startMöglichkeit,>> <<whendie>> <<justTrefferfunktion>> <<aselber>> <<modifierbestimmen>> <<iszu>> <<pressed
int
können
>> <<code(also>> <<=nicht>> <<e.getKeyCode();
if
nur
>> <<(codeSuche>> <<==nach>> <<KeyEvent.VK_SHIFTdem>> <<||Anfang>> <<codedes>> <<==Strings,>> <<KeyEvent.VK_CONTROL
||
sondern
>> <<codeeine>> <<==eigene>> <<KeyEvent.VK_ALT)Funktion>> <<{
return
z.B.
>> <<false;für reguläre Ausdrücke etc).>>

<<
}
//
:
>> <<Tryevtl.>> <<toist>> <<installdas>> <<theBuch>> <<editor
int
'Swing
>> <<leadRowHacks'>> <<=ein>> <<getSelectionModel().getLeadSelectionIndex();guter Hinweis. JavaBooklist. >>
<< int


==
>> <<leadColumnOptimierung>> <<=des>> <<getColumnModel().getSelectionModel()Zeichnens unter Swing ==>>
<< .getLeadSelectionIndex();>>
<< ifWer>> <<(leadRowwissen>> <<!=will,>> <<-1wie>> <<&&in>> <<leadColumnSwing>> <<!=was>> <<-1warum>> <<&&in>> <<!isEditing())welcher>> <<{
if
Methode
>> <<(!editCellAt(leadRow,gezeichnet>> <<leadColumn,wird>> <<e))und>> <<{
return
wer
>> <<false;
}
}
editorComponent
mehr
>> <<=über>> <<getEditorComponent();
if
paint(),
>> <<(editorComponentrepaint(),>> <<==update(),>> <<null)doubleBuffered,>> <<{
return
opaque
>> <<false;
}
//
und
>> <<-TB-
//
solche
>> <<selectSachen>> <<everythingerfahren>> <<(likemöchte,>> <<Spreadsheetals>> <<Appser>> <<do)
if
jemals
>> <<(editorComponentwissen>> <<instanceofwollte,>> <<JTextField)sollte>> <<{
((JTextField)
diesen
>> <<editorComponent).selectAll();Artikel lesen:>>
<< }>>
<< }http://java.sun.com/products/jfc/tsc/articles/painting/>>
<< }>>
<< booleanWer>> <<retValuewissen>> <<=will,>> <<super.processKeyBinding(ks,was>> <<e,sein>> <<condition,Programm>> <<pressed);
return
so
>> <<retValue;
}

}

}}}

treibt, kann dazu http://freedesktop.org/wiki/Software/Xephyr benutzen.
>>Das <<Ergebnis >>ist <<jetzt,ein>> <<dasXnest-ähnlicher>> <<manX-Server,>> <<einerseitsder>> <<mitin>> <<einereinem>> <<normalenFenster>> <<Tastearbeitet.>> <<denEr>> <<Zellinhalthat>> <<überschreibt,einen>> <<aberDebug-Mode,>> <<andererseitsder>> <<miteinem>> <<F2anzeigt,>> <<auchwann>> <<denwas>> <<vorhandenengezeichnet>> <<Inhaltwird.>> <<editierenDas>> <<kann!hilft>> <<--dabei,>> <<ThomasBayenmehrfache und unnötige refresh-Durchläufe zu finden.>>


<<=====>> <<Lösungdisablen>> <<des(ausgrauen)>> <<löschen-beim-editiereneines>> <<Problemsganzen>> <<mitJPanel>> <<~TableCellEditor =====>>

<<EineWenn>> <<andereman>> <<Lösungein>> <<hatkomplexes>> <<JensKapitzaWidget>> <<hieraus>> <<vorgestellt.mehreren>> <<NachUnterwidgets>> <<meinenaufgebaut>> <<Versuchenhat>> <<funktioniert(z.B.>> <<ein Eingabeformular), will man >>dieses <<genausoin>> <<gutmanchen>> <<wieFällen>> <<meineschon>> <<Lösung.mal>> <<Mirausser>> <<fälltBetrieb>> <<essetzen.>> <<auchMit>> <<schwer,einem>> <<eineeinzelnen>> <<derEingabefeld>> <<beidenwie>> <<Lösungeneinem>> <<für[JTextField|http://java.sun.com/javase/6/docs/api/javax/swing/JTextField.html]>> <<"besser"macht>> <<zuman>> <<erklären.das>> <<''(Lediglichdurch>> <<habeeinen>> <<ichAufruf>> <<beivon>> <<Jens[setEnabled(boolean)|http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#setEnabled(boolean)].>> <<LösungMan>> <<setzt damit aber immer nur >>das <<Gefühl,aktuell>> <<daßangesprochene>> <<man,Widget>> <<wennausser>> <<manKraft>> <<dortund>> <<Delegationnicht>> <<durchseine>> <<AbleitungTochterwidgets.

Dieses
>> <<ersetzt,Problem>> <<nochist>> <<einigerecht>> <<Zeilenschwierig>> <<Codezu>> <<sparenlösen,>> <<kann.)''weil>> <<--Sun>> <<ThomasBayenes scheinbar "vergessen" hat. Im groben gibt es zwei Methoden:>>

<<Man*>> <<kannrekursives>> <<dis-/enablen aller Tochterwidgets. Dabei ist zu beachten, daß >>es auch <<malWidgets>> <<eingeben>> <<wenigkann,>> <<andersdie>> <<füraus>> <<jedenanderen>> <<TypeGründen>> <<(hierbereits>> <<gehtdisabled>> <<essind.>> <<jaDiese>> <<nurmuss>> <<man sich merken, >>um <<String.class)die>> <<machenrichtigen>> <<esspäter>> <<folgwieder>> <<einzu>> <<kleinesenablen.>> <<Beispiel

{{{
//
In
>> <<GPLden>> <<v2meisten>> <<oderFällen>> <<höhersollte>> <<;)das>> <<
//
eine
>> <<(c)ordentliche>> <<2008Lösung>> <<Jensergeben.>> <<KapitzaHaben>> <<;)
import
sich
>> <<java.awt.Component;
import
die
>> <<java.awt.Dimension;
import
Tochterwidgets
>> <<java.awt.event.KeyEvent;
import
in
>> <<java.util.EventObject;

import
der
>> <<javax.swing.JFrame;
import
Zwischenzeit
>> <<javax.swing.JScrollPane;
import
jedoch
>> <<javax.swing.JTable;
import
verändert,
>> <<javax.swing.event.CellEditorListener;
import
gibt
>> <<javax.swing.table.TableCellEditor;
import
das
>> <<javax.swing.text.JTextComponent;

public
völliges
>> <<classChaos>> <<Hund>> <<{
ist
>> << nicht>> << publicpraktikabel.>> <<staticEin>> <<voidBeispiel>> <<main(String[]für>> <<args)eine>> <<{
//
solche
>> <<einfachesLösung>> <<fenseterfindet sich unter http://tips4java.wordpress.com/2009/08/02/disabled-panel/>>
<< JFrame
*
>> <<fMan>> <<=erzeugt>> <<neweine>> <<JFrame("a");
//
Art
>> <<einGlasspane,>> <<paardie>> <<testman>> <<daten
String[][]
über
>> <<ddas>> <<=normale>> <<newWidget>> <<String[][]legt>> <<{und>> <<{die>> <<"A",es>> <<"B","ausgraut".>> <<"C"Ausserdem>> <<},muss>> <<{man>> <<"A",noch>> <<"V",die>> <<"2"Tastatur-Lsitener>> <<}abschalten>> <<};
JTable
sowie
>> <<tdas>> <<=Widget>> <<newund>> <<JTable(d,seine>> <<newTöchter>> <<String[]aus>> <<{dem>> <<"AAAA",Focus-Traversal>> <<"BBBBBBBBB",herausnehmen.>>
<< "CCCCCCCCCCCCCCCC"**>> <<});
//
Eine
>> <<damitsolche>> <<manLösung>> <<wasgeht>> <<siehtmit>> <<
JScrollPane
dem
>> <<p[JXLayer|https://jxlayer.dev.java.net/].>> <<=Dieser>> <<newstellt>> <<JScrollPane(t);
//
eine
>> <<nunzusätzliche>> <<denSchicht>> <<editorzwischen>> <<holen
final
dem
>> <<TableCellEditorBenutzer>> <<tceund>> <<=dem>> <<t.getDefaultEditor(Object.class);

//
Widget
>> <<unddar,>> <<einmit>> <<wenigder>> <<ändern
//
man
>> <<siehealles>> <<flagmögliche>> <<selectmachen>> <<kann, unter anderem auch das Widget ausgrauen >>und <<getTableCellEditorComponentdeaktivieren.>> <<sowieInteressanterweise>> <<isCellEditableist>> <<
t.setDefaultEditor(Object.class,
das
>> <<newDing>> <<TableCellEditor()so>> <<{
//
toll,
>> <<daß >>ich <<mussnoch>> <<wissennicht>> <<obmal>> <<ichein>> <<diesesimples>> <<componenteausgrauen>> <<nunhinbekommen>> <<überschreibenhabe.>> <<soll:-)>> <<oderStattdessen>> <<nichtgibt>> <<wiees>> <<beieinen>> <<ooBlur-Effekt,>> <<calcden>> <<wennich>> <<aaus>> <<getippteiner>> <<wirdBildbearbeitungs-Bibliothek>> <<istnehmen>> <<musste.
** Unter http://tips4java.wordpress.com/2009/08/02/disabled-panel/ gibt
>>es <<überschreibenhierzu>> <<beiauch>> <<F2eine>> <<z.b.etwas>> <<nurbodenständigere>> <<einLösung,>> <<anhängen!
die
>> << aus>> << privatedrei>> <<booleanJava-Klassen>> <<selectbesteht,>> <<=die>> <<false;

gut
>> << erklärt>> << @Override
sind
>> << und>> << publicderen>> <<ComponentFunktionsweise>> <<getTableCellEditorComponent(JTableman>> <<table,
schnell
>> << verstehen>> << Objectkann.>> <<value,Je>> <<booleannach>> <<isSelected,Look&Feel>> <<intergibt>> <<row,sich>> <<inteine>> <<column)etwas>> <<{
//
seltsame
>> <<componenteFarbe>> <<holen
Component
beim
>> <<cmpausgrauen,>> <<=die>> <<tce.getTableCellEditorComponent(table,man>> <<value,
isSelected,
im
>> <<row,Quelltext>> <<column);aber einfach anpassen kann (statt der Suche im L&F einfach "Color(255,255,255)" nehmen).>>

<< //

==
>> <<wennHänger>> <<!f2beim>> <<dannDebugging>> <<allesin>> <<selcteiner ~JComboBox ==>>
<<//
Falls
>> <<istman,>> <<esz.B.>> <<einemit>> <<textcomponenteEclipse>> <<nurCode>> <<siedebuggen>> <<kenntwill,>> <<selectAllder>> <<!!!!!
if
innerhalb
>> <<(cmpder>> <<instanceofRender-Routine>> <<JTextComponent)einer>> <<{
~JComboBox
>> << läuft,>> << ifkann>> <<(select)das>> <<{zu>> <<//Problemen>> <<wennführen.>> <<esDas>> <<selectiertgilt>> <<z.B. für die Implementierung eines eigenen ~JComboBoxModel oder für diverse Listener, die dort aufgerufen >>werden <<sollkönnten.>> <<->Zum>> <<isCellEditableBeginn>> <<setztdes>> <<Zeichnens der Cmobobox sperrt Swing scheinbar aus irgendeinem Grund >>den <<flagX-Server.>> <<
//
Hält
>> <<dannder>> <<überschreibenDebugger>> <<ermöglichen!
((JTextComponent)
das
>> <<cmp).selectAll();
select
Programm
>> <<=nun>> <<false;
an
>> << der>> << }
}

return
flaschen
>> <<cmp;
Stelle
>> << an,>> << }so hängt der ganze X-Server. :-(>>

<< Kurzfristige>> << Abhilfe>> << @Override
schafft
>> << hier>> << publicdas>> <<voidEinloggen>> <<addCellEditorListener(CellEditorListenerauf>> <<l)der>> <<{Textkonsole und ein schnelles "{{killall java}}", da der X-Server nicht wirklich abgestürzt, sondern eben nur gesperrt ist. Aber damit ist das Debugging-Problem ja immer noch nicht gelöst.>>
<< tce.addCellEditorListener(l);>>
<< ===>> << Lösung>> << }1 ===>>

<< Wer>> << also>> << @Override
solchen
>> << Code>> << publicwirklich>> <<voiddebuggen>> <<cancelCellEditing()muss,>> <<{kann es mit einem zweiten X-Server so wie ich machen: Ich habe mit>>
<< tce.cancelCellEditing();>>
<< >>  <<Xephyr>> << }:1>>

<< einen>> << eigenen>> << @Override
"X-Server
>> << im>> << publicFenster">> <<Objectfür>> <<getCellEditorValue()mein>> <<{
return
Programm
>> <<tce.getCellEditorValue();
gestartet
>> << (sollte>> << }

mit
>> << "Xnest">> << @Override
auch
>> << gehen).>> << publicDann>> <<booleanbin>> <<isCellEditable(EventObjectich>> <<anEvent)in>> <<{
if
die
>> <<(anEventEclipse>> <<instanceofStartkonfiguration>> <<KeyEvent)gegangen>> <<{und>> <<//habe>> <<istdort>> <<esim>> <<ein"Environment">> <<Tastenden>> <<eventWert>> <<
//
"DISPLAY"
>> <<werauf>> <<lust":1">> <<hatgesetzt.>> <<kannNun>> <<jaläuft>> <<nochmein>> <<dieProgramm>> <<tasteninnerhalb>> <<codesdes>> <<abfangen!Xephyr-Fensters>> <<-->und>> <<f2hängt>> <<istauch>> <<keinnur>> <<KeyEventdiesen>> <<!!!
//
auf.
>> <<habEclipse>> <<(im normalen X-Server) ist >>aber <<auchweiterhin>> <<nichtnoch>> <<weiterbedienbar>> <<nachgegucktund>> <<
kann
>> << wunderbar>> << selectzum>> <<=Debuggen>> <<true;benutzt werden.>>
<< }>>
<<//Übrigens>> <<ActionEventbin>> <<kommtich>> <<rausauf>> <<unddieses>> <<dassProblem>> <<istschon>> <<vor einiger Zeit gestossen. Damals hatte ich mir notiert, daß >>ein <<AWTAufruf>> <<eventvon>> <<"{{setLightWeightPopupEnabled(false);}}" auf der ~JComboBox auch hilft. Tat es jetzt aber nicht mehr. Vielleicht hängt das von den Umständen ab >>und <<jeist>> <<nachim>> <<demZweifelsfall>> <<welchesauch>> <<einen Versuch wert.

Unter Umständen
>>kann <<esman>> <<einmit>> <<Keyevent,"export>> <<....DISPLAY=:1;>> <<metacity &" auch den Gnome Fenstermanager im Xephyr-Server starten, bevor man >>sein<< Java-Programm startet. Das erlaubt eine bessere Bedienung der Java-Fenster. -- ThomasBayen>>
<< System.out.println(anEvent);>>
<<//===>> <<mehrLösung>> <<will2>> <<===

Nach einigem Googlen habe
>>ich <<herausgefunden, daß ich >>nicht <<machen
return
der
>> <<tce.isCellEditable(anEvent);
einzige
>> << bin,>> << }

der
>> << das>> << @Override
Problem
>> << hat>> << public(http://bugs.sun.com/view_bug.do?bug_id=6517045>> <<voidund>> <<removeCellEditorListener(CellEditorListenervor>> <<l)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.removeCellEditorListener(l);>>
<< >>  <<  }-Dsun.awt.disablegrab=true>>

<< als>> << VM-Parameter>> << @Override
das
>> << Problem>> << publicauch>> <<booleanumgehen.>> <<shouldSelectCell(EventObject''(Ich>> <<anEvent)frage>> <<{
return
mich
>> <<tce.shouldSelectCell(anEvent);
zwar,
>> << wenn>> << }

jemand
>> << einen>> << @Override
Schalter
>> << dafür>> << publiceingebaut>> <<booleanhat,>> <<stopCellEditing()warum>> <<{
return
der
>> <<tce.stopCellEditing();
nicht
>> << immer>> << }eingeschaltet ist, aber was solls...)''>>

<< });>>
<< p.setPreferredSize(new
==
>> <<Dimension(200,Wizards>> <<400));programmieren ==>>
<< f.add(p);>>
<< f.pack();
//
Ein
>> <<anzeigenjeder>> <<undhat>> <<wohl schon mal einen Wizard bedient, z.B. >>in der <<consoleForma>> <<guckenals einen Installer. Da kommt natürlich die Frage auf, wie man sowas selber programmieren kann. Es geht dabei zumeist um eine Abfolge von Seiten, in denen man Eingaben tätigen kann. Diese werden ggf. überprüft und abhängig von den Eingaben kommt man auf 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:>>
<< f.setVisible(true);>>
<<
*
>> << [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.>>
<<}


}}}


==
*
>> <<Zuordnunghttps://wizard.dev.java.net>> <<- Wizard API aus den [SwingLabs|https://swinglabs.dev.java.net/], bzw. >>von <<TastenfunktionenSun-Mitarbeiter>> <<==Tim Boudreau>>
<<** [using the Wizards API|http://today.java.net/article/2006/02/24/using-wizard-api] - Artikel der Entwickler dieses Projektes>>
<<In**>> <<einer[Zauberhafte>> <<TabelleDialoge|http://www.heise.de/ix/artikel/Zauberhafte-Dialoge-506947.html]>> <<hatte->> <<ich'''deutscher'''>> <<damitArtikel>> <<gekämpft,aus>> <<daßder>> <<maniX
**
>> <<mit[Javaworld-Artikel|http://www.javaworld.com/javaworld/jw-04-2008/jw-04-opensourcejava-wizard-api.html]>> <<TAB->> <<nichtebenfalls>> <<inüber>> die <<nächsteWizard>> <<TabellenzelleAPI
*
>> <<kam.[Java>> <<DerWizard>> <<FehlerFramework|http://sourceforge.net/projects/jwf]>> <<lag(JWF)>> <<ganz->> <<woanders,älteres>> <<aberProjekt,>> <<ichwird>> <<habeauch>> <<etwasgelobt,>> <<überletzte>> <<dieVersion>> <<Zuordnungallerdings>> von <<Tasten2002
*
>> <<[CJWizard|http://code.google.com/p/cjwizard/] - neueres Projekt. Der Autor sagt, daß er auf der Wizard API aufbaut und es besser gemacht hat. scheint ein aktives Projekt >>zu <<Aktionensein
**
>> <<gelernt.http://code.google.com/p/cjwizard/wiki/QuickStartGuide>> <<Wer->> <<alsokurze>> <<wissenEinführung>> <<will,in>> <<wiediese>> <<besondereBibliothek
*
>> <<Eventshttps://wizard-framework.dev.java.net/>> <<wie->> <<z.B.noch>> <<Cursortasten,ein>> <<TAB,Framework,>> <<oderaber>> <<auchohne>> <<MausaktionenDoku,>> <<zugeordnetohne>> <<werden,Download,>> <<solltenur>> <<einfachein>> <<imCVS>> <<ganz(letzter>> <<normalenEintrag>> <<[JavaTutorial|http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html])fündig2007)>> <<nachlesen.und>> <<Dorteine>> <<ist[Javadoc-API|http://pietschy.org/software/wizard-framework/api/]>> <<auf einem anderen Server



== sonstige Seiten zum Thema ==

* 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}]