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. <<IdeenIch>> <<hierzumöchte>> <<findenjeden>> <<sichUnterschied,>> <<auf >>der <<Seitemich>> <<JTableAlsSpreadsheet.


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

<<In===>> <<einersofortiges>> <<Tabellelöschen>> <<hattebeim>> <<icheditieren>> <<damit===

Wenn
>> <<gekämpft, daß >>man <<miteine>> <<TABTextzelle>> <<nicht(z.B.>> <<inmit>> <<dieder>> <<nächsteMaus)>> <<Tabellenzelleaktiviert>> <<kam.hat>> <<Derund>> <<Fehlerdann>> <<lageine>> <<ganzalphanumerische>> <<woanders,Taste>> <<aberdrückt,>> <<ichwird>> <<habediese>> <<etwasTaste>> <<überan>> <<diedas>> <<ZuordnungEnde>> <<vondes>> <<Tastenbestehenden>> <<zuTextes>> <<Aktionenangefügt.>> <<gelernt.Das>> <<Wergleiche>> <<alsopassiert>> <<wissenbeim>> <<will,Drücken>> <<wievon>> <<besondereF2.>> <<EventsIn>> <<wieOOo>> <<z.B.Calc>> <<Cursortasten,ist>> <<TAB,es>> <<oderso,>> <<auchdaß>> <<Mausaktionenbeim>> <<zugeordneteinfachen>> <<werden,Drücken>> <<sollteder>> <<einfachbestehende>> <<imWert>> <<ganzimmer>> <<normalenüberschrieben>> <<[JavaTutorial|http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html])fündigwird>> <<nachlesen.und>> <<Dortman>> <<istF2>> <<sehrdrücken>> <<gutmuss,>> <<erklärt,um>> <<wasden>> <<esWert>> <<miteditieren>> <<~InputMapzu>> <<und ~ActionMap auf sich hat.können.>>

<<
==
Dieses
>> <<ActionsProblem>> <<==

Das [Action|http://java.sun.com/javase/6/docs/api/javax/swing/Action.html]-Interface
>>ist <<eigentlichaufgrund>> <<eineder>> <<rechtStruktur>> <<guteder>> <<Grundidee.JTable-Klasse>> <<Einegar>> <<vonnicht>> <<einemso>> <<Programmtrivial,>> <<ausführbarewie>> <<Funktionich>> <<wirddachte.>> <<abstrahiertDeshalb>> <<alsdokumentiere>> <<Actionich>> <<verpackthier>> <<undeinen>> <<kannTeil>> <<danndes>> <<z.B.Weges,>> <<einemden>> <<Buttonich>> <<und/oderzu>> <<einemmeiner>> <<MenüLösung>> <<zugeordnetgenommen>> <<werden.habe,>> <<Leiderum>> <<reichtggf.>> <<diespäter>> <<Implementationbeim>> <<dernachbessern>> <<Standard-Klassen vorne und hinten >>nicht <<aus,alles>> <<umneu>> <<komfortabelsuchen>> zu <<arbeiten. Auf der Seite JavaActions werden einige Aspekte von Actions diskutiert.müssen:>>

<<
==
Zuerstmal
>> <<Zellesteht>> <<inim>> <<einer[Swingwiki|http://www.swingwiki.org/best:edit_cells_like_excel],>> <<Tabelledaß>> <<aktiverendie>> <<==

Wer
eine
>> <<durchLösung>> <<einhätten.>> <<ProgrammDiese>> <<(alsoLösung>> <<nichtbasiert>> <<durchdarauf,>> <<anklicken)daß>> <<eineein>> <<Zelle~DefaultCellEditor>> <<aktivierengesetzt>> <<will,wird,>> <<mussder>> sich <<genaubeim>> <<überlegen,Aufruf>> <<wasautomatisch>> <<erkomplett>> <<dennselektiert.>> <<nunDas>> <<will.hilft>> <<Eszwar,>> <<gibtwenn>> <<dieich>> <<Selektioneine>> <<deralphanumerische>> <<TabelleTaste>> <<unddrücke,>> <<dasselektiert>> <<Feld,aber>> <<aufbei>> <<demF2>> <<derebenfalls>> <<TAB-Focusden>> <<liegtgesamten>> <<Text >>und <<dannverhindert>> <<kannsomit,>> <<esdas>> <<nochman>> einen <<geöffnetenvorhandenen>> <<EditorZelleninhalt>> <<(miteditieren>> <<undkann.

In
>> <<ohneeinem>> <<Tastatur-Focus)[Sun-Forum|http://forums.sun.com/thread.jspa?forumID=57&threadID=752727]>> <<geben.steht>> <<Allein>> <<diesQuelltext,>> <<sindvon>> <<komplettdem>> <<unterschiedlicheich>> <<Dinge.überhaupt>> <<Dasnicht>> <<Ergebnis,verstehe,>> <<daswas>> <<man am ehesten erwartet (das dem Klick mit >>der <<Maussoll.>> <<amIch>> <<ehestenhabe>> <<entspricht),ihn>> <<gibtnicht>> <<meinesausprobiert,>> <<Erachtens >>nach <<folgenderder>> <<Code:

{{{
Beschreibung
>> << table.requestFocusInWindow();
sollte
>> << table.editCellAt(2,er>> <<2);
aber
>> << table.changeSelection(2, 2, false, false);
}}}
>>mit <<denmeinem>> <<folgendenProblem>> <<Befehlenzu>> <<wirdtun>> <<die Selektion verändert:haben.>>
<<{{{>>
<<In>> << table.getSelectionModel().setLeadSelectionIndex(2);
einem
>> << table.getColumnModel().getSelectionModel().setLeadSelectionIndex(2);
[Artikel|http://www.informit.com/articles/article.aspx?p=24130&seqNum=11]
>> << table.getSelectionModel().setAnchorSelectionIndex(2);
mit
>> << table.getColumnModel().getSelectionModel().setAnchorSelectionIndex(2);
}}}
evtl.
einem
>> <<istrelativ>> <<daseinfachen>> <<hierNiveau>> <<dannfand>> <<auchich>> <<nochden>> <<hilfreich:
{{{
Hinweis,
>> << table.scrollRectToVisible(table.getCellRect(2,wie>> <<2,Funktionstasten>> <<true));
}}}

==
und
>> <<richtigalphanumerische>> <<grosseTasten>> <<Listenüberhaupt>> <<anzeigenbehandelt>> <<==

Das
werden
>> <<~ListModelund>> <<kannwo>> <<prinzipiellder>> <<auchUnterschied>> <<mitliegt:>> <<richtigScheinbar>> <<grossenwird>> <<Listenin>> <<umgehen.~BasicTableUI>> <<Dabeientschieden,>> <<gibtob>> es <<allerdingssich>> <<einum>> <<paareine>> <<Tricks.einzufügende>> <<ZumTaste>> <<einenoder>> <<sollteeine>> <<manSondertaste>> <<mit(z.B.>> <<setPrototypeCellValue()Pfeiltaste>> <<einenoder>> <<WertF2)>> <<mithandelt.>> <<maximalerF2>> <<Ausgabegrößewird>> <<setzen,dann>> <<umin>> <<zu~BasicTableUI.actionPerformed>> <<verhindern,als>> <<daßAction>> <<beimSTART_EDITING>> <<Erstellenbehandelt,>> <<desnormale>> <<WidgetsTasten>> <<allein>> <<Elemente testweise gezeichnet werden, um das Größte zu finden.~JTable.processKeyBinding().>>

<<EinParallel>> <<paarfand>> <<zusätzlicheich>> <<Schwierigkeiten ergeben sich, wenn man eine richtig grosse Liste >>in <<einereinem>> <<~ComboBox[Forumsthread>> <<verwendenzum>> <<will,Thema|http://forums.java.net/jive/thread.jspa?threadID=42682&tstart=0]>> <<insbesondereeinen>> <<wennBeitrag>> <<dievon>> <<Zugriff"oswald",>> <<aufder>> <<dieversucht>> <<Elementehatte,>> <<langsam~processKeyBinding()>> <<istzu>> <<(z.B.überladen,>> <<ausaber>> <<einermit>> <<Datenbank).dieser>> <<HierIdee>> <<werdennicht>> <<anvorwärtsgekommen>> <<mehrerenwar.>> <<StellenNachdem>> <<Schleifenich>> <<verwendet, um relativ simple Aufgaben zu lösen. Um >>das <<zudurchdacht>> <<umgehen,hatte,>> <<müssenmerkte>> <<einich,>> <<paardaß>> <<Methodendieser>> <<überladenGedanke>> <<undder>> <<einbeste>> <<bisschenwar,>> <<gehackt werden. Das würde allerdings hier >>den <<Rahmen sprengen. Wer eine Datenbank-taugliche Lösung sucht, kann mich fragen, >>ich <<habegesehen>> <<hierfürhatte.>> <<eineIch>> <<abgeleitetebeschäftigte>> <<Variante der ~ComboBox, die ich >>mit <<tausendenintensiver>> <<von Einträgen benutze.  -- ThomasBayen



== ~JComboBox
>>mit <<Autocompletiondieser>> <<==

Für
Methode,
>> <<richtigfand>> <<grossedas>> <<ListenProblem,>> <<istdas>> <<esoswald>> <<dannhatte,>> <<aucheinen>> <<sinnvoll,Workaround>> <<diesehierfür>> <<ordentlichund>> <<durchsuchen zu können. Dazu bedarf es einer Autovervollständigung (wie z.B. im Firefox URL-Feld). Ich >>habe <<etwasfolgende>> <<gegoogeltLösung>> <<und Ansätze hierzu unter folgenden Links gefunden:implementiert:>>
<<{{{>>
<<*public>> <<http://today.java.net/pub/a/today/2007/07/19/adding-auto-completion-to-swing-comboboxes.htmlclass>> <<-SpreadsheetJTable>> <<Artikelextends>> <<zumJTable>> <<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>> <<https://swinglabs.org/boolean>> <<enthältprocessKeyBinding(KeyStroke>> <<imks,>> <<~SwingX-ProjektKeyEvent>> <<eine sauber aufgebaute Lösunge,>>
<<* int>> <<http://www.java.happycodings.com/Java_Swing/code6.htmlcondition,>> <<-boolean>> <<einfaches,pressed)>> <<undokumentiertes Beispiel{>>
<<* http://snippets.dzone.com/posts/show/7633 - einfaches, undokumentiertes Beispiel /*>>
<<
Swinglabs
>> <<enthält*>> <<ProjekteDer>> <<vonInhalt>> <<Sun,dieses>> <<dieif-Blocks>> <<potentiellist>> <<inaus>> <<dasder>> <<nächstesuper-Methode>> <<Javaentnommen.>> <<aufgenommenIch
>> <<werden*>> <<könnten.erzeuge>> <<Dashier>> <<bedeutet, >>die <<dortigeEditor-Komponente>> <<Lösunggenauso>> <<istwie>> <<ganz gut dokumentiert, in eine ordentliche API zerlegt und integriert sich sauber mit Swing. Das ist >>im <<PrinzipOriginal.>> <<dieDann
>> <<sauberste*>> <<Lösung,selektiere>> <<die >>ich <<bisherallerdings>> <<gefundenden>> <<habe.ganzen>> <<LeiderText>> <<unterstützt sie kein Filtern der Liste.

Der obengenannte [Artikel von Thomas Bierhance|http://www.orbital-computer.de/JComboBox/] scheint sowas
>>wie <<die Mutter aller Autocompletion-Lösungen zu sein. Alle scheinen 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,Spreadsheet-Applikationen>> <<überüblich.
>> <<die*/
if
>> <<Schulter(condition>> <<schauen==>> <<möchte.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
&&
>> <<ImisFocusOwner()
&&
>> <<übrigen!Boolean.FALSE
.equals((Boolean)
>> <<hatgetClientProperty("JTable.autoStartsEdit")))>> <<er{
//
>> <<sichWe>> <<amdo>> <<Endenot>> <<deshave>> <<Artikelsa>> <<auchbinding>> <<meinefor>> <<Gedankenthe>> <<überevent.
Component
>> <<grosseeditorComponent>> <<Listen=>> <<undgetEditorComponent();
if
>> <<die(editorComponent>> <<Performance-Probleme==>> <<gemacht.null)>> <<Er{
//
>> <<hastOnly>> <<denattempt>> <<gleichento>> <<Buginstall>> <<gefundenthe>> <<wieeditor>> <<ichon>> <<unda>> <<ihnKEY_PRESSED,
if
>> <<auch(e>> <<per==>> <<Reflectionnull>> <<gelöst.||>> <<Wase.getID()>> <<mich!=>> <<dabeiKeyEvent.KEY_PRESSED)>> <<auf{
return
>> <<diefalse;
}
//
>> <<PalmeDon't>> <<bringt,start>> <<ist,when>> <<daßjust>> <<diesera>> <<Artikelmodifier>> <<seitis>> <<2004pressed
int
>> <<imcode>> <<Netz=>> <<steht,e.getKeyCode();
if
>> <<offensichtlich(code>> <<sogar==>> <<irgendjemandKeyEvent.VK_SHIFT>> <<aus||>> <<Sunscode>> <<~SwingX-Team==>> <<ihnKeyEvent.VK_CONTROL
||
>> <<wahrgenommencode>> <<und==>> <<daranKeyEvent.VK_ALT)>> <<herumgebastelt{
return
>> <<hat und Sun/Oracle sowas bis heute nicht ins JDK bekommen hat. Also durfte ich mal wieder das Rad neu erfinden. -- ThomasBayenfalse;>>


<< }>>
<<=== //>> <<nochTry>> <<zuto>> <<lösendeinstall>> <<Problemethe>> <<===editor>>
<<
Leider
int
>> <<unterstützenleadRow>> <<viele=>> <<LösungengetSelectionModel().getLeadSelectionIndex();
int
>> <<dasleadColumn>> <<Filtern=>> <<nicht,getColumnModel().getSelectionModel()
.getLeadSelectionIndex();
if
>> <<deshalb(leadRow>> <<hier!=>> <<nochmal-1>> <<zur&&>> <<Erklärung:leadColumn>> <<Wenn!=>> <<ich-1>> <<den&&>> <<Anfang!isEditing())>> <<eines{
if
>> <<Begriffes(!editCellAt(leadRow,>> <<eingebe,leadColumn,>> <<mächtee))>> <<ich,{
return
>> <<daß in der Liste darunter nur noch die Einträge stehen, die zu meinem Anfang passen (wie im Firefox). Die Swinglabs-Lösung z.B. lässt die Liste wie sie ist, geht aber automatisch zum ersten Eintrag, der passt. Ob noch weitere passen könnten, sehe ich nicht (wenn die nicht direkt untereinander stehen).false;>>
<< }>>
<<Neben }
editorComponent
>> <<dem=>> <<FilterngetEditorComponent();
if
>> <<sind(editorComponent>> <<meine==>> <<Anforderungennull)>> <<noch:{
return
>> <<Der Umgang mit richtig grossen Listen (also eine API, in die ich Datenbankzugriffe reinschreiben kann) sowie die Möglichkeit, die Trefferfunktion selber bestimmen zu können (also nicht nur Suche nach dem Anfang des Strings, sondern eine eigene Funktion z.B. für reguläre Ausdrücke etc).false;>>
<< }>>
<<: //>> <<evtl.-TB-
//
>> <<istselect>> <<daseverything>> <<Buch(like>> <<'SwingSpreadsheet>> <<Hacks'Apps>> <<eindo)
if
>> <<guter(editorComponent>> <<Hinweis.instanceof>> <<JavaBooklist.JTextField)>> <<{>>
<< ((JTextField) editorComponent).selectAll();>>
<< }>>
<< }>>
<<== }
boolean
>> <<OptimierungretValue>> <<des=>> <<Zeichnenssuper.processKeyBinding(ks,>> <<untere,>> <<Swingcondition,>> <<==pressed);>>
<<
Wer
return
>> <<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:retValue;>>
<< }>>
<<http://java.sun.com/products/jfc/tsc/articles/painting/>>
<<}>>
<<Wer
}}}

Das
>> <<wissenErgebnis>> <<will, was sein Programm so treibt, kann dazu http://freedesktop.org/wiki/Software/Xephyr benutzen. Das >>ist <<einjetzt,>> <<Xnest-ähnlicherdas>> <<X-Server,man>> <<dereinerseits>> <<inmit>> <<einemeiner>> <<Fensternormalen>> <<arbeitet.Taste>> <<Erden>> <<hatZellinhalt>> <<einenüberschreibt,>> <<Debug-Mode,aber>> <<derandererseits>> <<einemmit>> <<anzeigt,F2>> <<wannauch>> <<wasden>> <<gezeichnetvorhandenen>> <<wird.Inhalt>> <<Daseditieren>> <<hilftkann!>> <<dabei,-->> <<mehrfache und unnötige refresh-Durchläufe zu finden.ThomasBayen>>


<<=====>> <<disablenLösung>> <<(ausgrauen)des>> <<eineslöschen-beim-editieren>> <<ganzenProblems>> <<JPanelmit>> <<==~TableCellEditor ===>>

<<WennEine>> <<manandere>> <<einLösung>> <<komplexeshat>> <<WidgetJensKapitza>> <<aushier>> <<mehrerenvorgestellt.>> <<UnterwidgetsNach>> <<aufgebautmeinen>> <<hatVersuchen>> <<(z.B.funktioniert>> <<ein Eingabeformular), will man >>dieses <<ingenauso>> <<manchengut>> <<Fällenwie>> <<schonmeine>> <<malLösung.>> <<ausserMir>> <<Betriebfällt>> <<setzen.es>> <<Mitauch>> <<einemschwer,>> <<einzelneneine>> <<Eingabefeldder>> <<wiebeiden>> <<einemLösungen>> <<[JTextField|http://java.sun.com/javase/6/docs/api/javax/swing/JTextField.html]für>> <<macht"besser">> <<manzu>> <<daserklären.>> <<durch''(Lediglich>> <<einenhabe>> <<Aufrufich>> <<vonbei>> <<[setEnabled(boolean)|http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#setEnabled(boolean)].Jens>> <<ManLösung>> <<setzt damit aber immer nur >>das <<aktuellGefühl,>> <<angesprochenedaß>> <<Widgetman,>> <<ausserwenn>> <<Kraftman>> <<unddort>> <<nichtDelegation>> <<seinedurch>> <<Tochterwidgets.

Dieses
Ableitung
>> <<Problemersetzt,>> <<istnoch>> <<rechteinige>> <<schwierigZeilen>> <<zuCode>> <<lösen,sparen>> <<weilkann.)''>> <<Sun-->> <<es scheinbar "vergessen" hat. Im groben gibt es zwei Methoden:ThomasBayen>>

<<*Man>> <<rekursiveskann>> <<dis-/enablen aller Tochterwidgets. Dabei ist zu beachten, daß >>es auch <<Widgetsmal>> <<gebenein>> <<kann,wenig>> <<dieanders>> <<ausfür>> <<anderenjeden>> <<GründenType>> <<bereits(hier>> <<disabledgeht>> <<sind.es>> <<Dieseja>> <<mussnur>> <<man sich merken, >>um <<dieString.class)>> <<richtigenmachen>> <<späteres>> <<wiederfolg>> <<zuein>> <<enablen.kleines>> <<InBeispiel

{{{
//
>> <<denGPL>> <<meistenv2>> <<Fällenoder>> <<solltehöher>> <<das;)>> <<eine
//
>> <<ordentliche(c)>> <<Lösung2008>> <<ergeben.Jens>> <<HabenKapitza>> <<sich;)
import
>> <<diejava.awt.Component;
import
>> <<Tochterwidgetsjava.awt.Dimension;
import
>> <<injava.awt.event.KeyEvent;
import
>> <<derjava.util.EventObject;

import
>> <<Zwischenzeitjavax.swing.JFrame;
import
>> <<jedochjavax.swing.JScrollPane;
import
>> <<verändert,javax.swing.JTable;
import
>> <<gibtjavax.swing.event.CellEditorListener;
import
>> <<dasjavax.swing.table.TableCellEditor;
import
>> <<völligesjavax.swing.text.JTextComponent;

public
>> <<Chaosclass>> <<undH>> <<ist{
>> <<nicht >> <<praktikabel. public>> <<Einstatic>> <<Beispielvoid>> <<fürmain(String[]>> <<eineargs)>> <<solche{
//
>> <<Lösungeinfaches>> <<findet sich unter http://tips4java.wordpress.com/2009/08/02/disabled-panel/fenseter>>
<<
*
JFrame
>> <<Manf>> <<erzeugt=>> <<einenew>> <<ArtJFrame("a");
//
>> <<Glasspane,ein>> <<diepaar>> <<mantest>> <<überdaten
String[][]
>> <<dasd>> <<normale=>> <<Widgetnew>> <<legtString[][]>> <<und{>> <<die{>> <<es"A",>> <<"ausgraut"."B",>> <<Ausserdem"C">> <<muss},>> <<man{>> <<noch"A",>> <<die"V",>> <<Tastatur-Lsitener"2">> <<abschalten}>> <<sowie};
JTable
>> <<dast>> <<Widget=>> <<undnew>> <<seineJTable(d,>> <<Töchternew>> <<ausString[]>> <<dem{>> <<Focus-Traversal"AAAA",>> <<herausnehmen."BBBBBBBBB",>>
<<** "CCCCCCCCCCCCCCCC">> <<Eine});
//
>> <<solchedamit>> <<Lösungman>> <<gehtwas>> <<mitsieht>> <<dem
JScrollPane
>> <<[JXLayer|https://jxlayer.dev.java.net/].p>> <<Dieser=>> <<stelltnew>> <<eineJScrollPane(t);
//
>> <<zusätzlichenun>> <<Schichtden>> <<zwischeneditor>> <<demholen
final
>> <<BenutzerTableCellEditor>> <<undtce>> <<dem=>> <<Widgett.getDefaultEditor(Object.class);

//
>> <<dar,und>> <<mitein>> <<derwenig>> <<manändern
//
>> <<allessiehe>> <<möglicheflag>> <<machenselect>> <<kann, unter anderem auch das Widget ausgrauen >>und <<deaktivieren.getTableCellEditorComponent>> <<Interessanterweisesowie>> <<istisCellEditable>> <<das
t.setDefaultEditor(Object.class,
>> <<Dingnew>> <<soTableCellEditor()>> <<toll,{
//
>> <<daß >>ich <<nochmuss>> <<nichtwissen>> <<malob>> <<einich>> <<simplesdiese>> <<ausgrauencomponente>> <<hinbekommennun>> <<habe.überschreiben>> <<:-)soll>> <<Stattdessenoder>> <<gibtnicht>> <<eswie>> <<einenbei>> <<Blur-Effekt,oo>> <<dencalc>> <<ichwenn>> <<ausa>> <<einergetippt>> <<Bildbearbeitungs-Bibliothekwird>> <<nehmenist>> <<musste.
** Unter http://tips4java.wordpress.com/2009/08/02/disabled-panel/ gibt
>>es <<hierzuüberschreiben>> <<auchbei>> <<eineF2>> <<etwasz.b.>> <<bodenständigerenur>> <<Lösung,ein>> <<dieanhängen!
>> <<aus >> <<drei private>> <<Java-Klassenboolean>> <<besteht,select>> <<die=>> <<gutfalse;

>> <<erklärt >> <<sind @Override
>> <<und >> <<deren public>> <<FunktionsweiseComponent>> <<mangetTableCellEditorComponent(JTable>> <<schnelltable,
>> <<verstehen >> <<kann. Object>> <<Jevalue,>> <<nachboolean>> <<Look&FeelisSelected,>> <<ergibtint>> <<sichrow,>> <<eineint>> <<etwascolumn)>> <<seltsame{
//
>> <<Farbecomponente>> <<beimholen
Component
>> <<ausgrauen,cmp>> <<die=>> <<mantce.getTableCellEditorComponent(table,>> <<imvalue,
isSelected,
>> <<Quelltextrow,>> <<aber einfach anpassen kann (statt der Suche im L&F einfach "Color(255,255,255)" nehmen).column);>>

<<

==
//
>> <<Hängerwenn>> <<beim!f2>> <<Debuggingdann>> <<inalles>> <<einer ~JComboBox ==selct>>
<<
Falls
//
>> <<man,ist>> <<z.B.es>> <<miteine>> <<Eclipsetextcomponente>> <<Codenur>> <<debuggensie>> <<will,kennt>> <<derselectAll>> <<innerhalb!!!!!
if
>> <<der(cmp>> <<Render-Routineinstanceof>> <<einerJTextComponent)>> <<~JComboBox{
>> <<läuft, >> <<kann if>> <<das(select)>> <<zu{>> <<Problemen//>> <<führen.wenn>> <<Dases>> <<giltselectiert>> <<z.B. für die Implementierung eines eigenen ~JComboBoxModel oder für diverse Listener, die dort aufgerufen >>werden <<könnten.soll>> <<Zum->>> <<BeginnisCellEditable>> <<dessetzt>> <<Zeichnens der Cmobobox sperrt Swing scheinbar aus irgendeinem Grund >>den <<X-Server.flag>> <<Hält
//
>> <<derdann>> <<Debuggerüberschreiben>> <<dasermöglichen!
((JTextComponent)
>> <<Programmcmp).selectAll();
select
>> <<nun=>> <<anfalse;
>> <<der >> <<flaschen }
}

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

<<Kurzfristige >> <<Abhilfe >> <<schafft @Override
>> <<hier >> <<das public>> <<Einloggenvoid>> <<aufaddCellEditorListener(CellEditorListener>> <<derl)>> <<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 >> <<solchen @Override
>> <<Code >> <<wirklich public>> <<debuggenvoid>> <<muss,cancelCellEditing()>> <<kann es mit einem zweiten X-Server so wie ich machen: Ich habe mit{>>
<< tce.cancelCellEditing();>>
<< >>  <<Xephyr>> <<:1 }>>

<<einen >> <<eigenen >> <<"X-Server @Override
>> <<im >> <<Fenster" public>> <<fürObject>> <<meingetCellEditorValue()>> <<Programm{
return
>> <<gestartettce.getCellEditorValue();
>> <<(sollte >> <<mit }

>> <<"Xnest" >> <<auch @Override
>> <<gehen). >> <<Dann public>> <<binboolean>> <<ichisCellEditable(EventObject>> <<inanEvent)>> <<die{
if
>> <<Eclipse(anEvent>> <<Startkonfigurationinstanceof>> <<gegangenKeyEvent)>> <<und{>> <<habe//>> <<dortist>> <<imes>> <<"Environment"ein>> <<denTasten>> <<Wertevent>> <<"DISPLAY"
//
>> <<aufwer>> <<":1"lust>> <<gesetzt.hat>> <<Nunkann>> <<läuftja>> <<meinnoch>> <<Programmdie>> <<innerhalbtasten>> <<descodes>> <<Xephyr-Fenstersabfangen!>> <<und-->>> <<hängtf2>> <<auchist>> <<nurkein>> <<diesenKeyEvent>> <<auf.!!!
//
>> <<Eclipsehab>> <<(im normalen X-Server) ist >>aber <<weiterhinauch>> <<nochnicht>> <<bedienbarweiter>> <<undnachgeguckt>> <<kann
>> <<wunderbar >> <<zum select>> <<Debuggen=>> <<benutzt werden.true;>>
<< }>>
<<Übrigens//>> <<binActionEvent>> <<ichkommt>> <<aufraus>> <<diesesund>> <<Problemdass>> <<schonist>> <<vor einiger Zeit gestossen. Damals hatte ich mir notiert, daß >>ein <<AufrufAWT>> <<vonevent>> <<"{{setLightWeightPopupEnabled(false);}}" auf der ~JComboBox auch hilft. Tat es jetzt aber nicht mehr. Vielleicht hängt das von den Umständen ab >>und <<istje>> <<imnach>> <<Zweifelsfalldem>> <<auchwelches>> <<einen Versuch wert.

Unter Umständen
>>kann <<manes>> <<mitein>> <<"exportKeyevent,>> <<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);>>
<<===//>> <<Lösungmehr>> <<2will>> <<===

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

>> <<das >> <<Problem @Override
>> <<hat >> <<(http://bugs.sun.com/view_bug.do?bug_id=6517045 public>> <<undvoid>> <<vorremoveCellEditorListener(CellEditorListener>> <<alleml)>> <<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 >> <<das @Override
>> <<Problem >> <<auch public>> <<umgehen.boolean>> <<''(IchshouldSelectCell(EventObject>> <<frageanEvent)>> <<mich{
return
>> <<zwar,tce.shouldSelectCell(anEvent);
>> <<wenn >> <<jemand }

>> <<einen >> <<Schalter @Override
>> <<dafür >> <<eingebaut public>> <<hat,boolean>> <<warumstopCellEditing()>> <<der{
return
>> <<nichttce.stopCellEditing();
>> <<immer >> <<eingeschaltet ist, aber was solls...)'' }>>

<< });>>
<<
==
p.setPreferredSize(new
>> <<WizardsDimension(200,>> <<programmieren ==400));>>
<< f.add(p);>>
<<Ein f.pack();
//
>> <<jederanzeigen>> <<hatund>> <<wohl schon mal einen Wizard bedient, z.B. >>in der <<Formaconsole>> <<als 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:gucken>>
<< 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. }>>
<<*}


}}}


==
>> <<https://wizard.dev.java.netZuordnung>> <<- Wizard API aus den [SwingLabs|https://swinglabs.dev.java.net/], bzw. >>von <<Sun-MitarbeiterTastenfunktionen>> <<Tim Boudreau==>>
<<** [using the Wizards API|http://today.java.net/article/2006/02/24/using-wizard-api] - Artikel der Entwickler dieses Projektes>>
<<**In>> <<[Zauberhafteeiner>> <<Dialoge|http://www.heise.de/ix/artikel/Zauberhafte-Dialoge-506947.html]Tabelle>> <<-hatte>> <<'''deutscher'''ich>> <<Artikeldamit>> <<ausgekämpft,>> <<derdaß>> <<iX
**
man
>> <<[Javaworld-Artikel|http://www.javaworld.com/javaworld/jw-04-2008/jw-04-opensourcejava-wizard-api.html]mit>> <<-TAB>> <<ebenfallsnicht>> <<überin>> die <<Wizardnächste>> <<API
*
Tabellenzelle
>> <<[Javakam.>> <<WizardDer>> <<Framework|http://sourceforge.net/projects/jwf]Fehler>> <<(JWF)lag>> <<-ganz>> <<ältereswoanders,>> <<Projekt,aber>> <<wirdich>> <<auchhabe>> <<gelobt,etwas>> <<letzteüber>> <<Versiondie>> <<allerdingsZuordnung>> von <<2002
*
Tasten
>> <<[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 <<sein
**
Aktionen
>> <<http://code.google.com/p/cjwizard/wiki/QuickStartGuidegelernt.>> <<-Wer>> <<kurzealso>> <<Einführungwissen>> <<inwill,>> <<diesewie>> <<Bibliothek
*
besondere
>> <<https://wizard-framework.dev.java.net/Events>> <<-wie>> <<nochz.B.>> <<einCursortasten,>> <<Framework,TAB,>> <<aberoder>> <<ohneauch>> <<Doku,Mausaktionen>> <<ohnezugeordnet>> <<Download,werden,>> <<nursollte>> <<eineinfach>> <<CVSim>> <<(letzterganz>> <<Eintragnormalen>> <<2007)[JavaTutorial|http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html])fündig>> <<undnachlesen.>> <<eineDort>> <<[Javadoc-API|http://pietschy.org/software/wizard-framework/api/]ist>> <<auf einem anderen Server



== sonstige Seiten zum Thema ==

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