Swing InputVerifer auf TextField

Status
Nicht offen für weitere Antworten.

Meru

Bekanntes Mitglied
Hallo,

ich habe habe eine GUI, auf der eine Eingabemaske dargestellt wird. Der Benutzer hat nun die Möglichkeit, einen Datensatz, welcher vorher gewählt wurde, in die Eingabemaske zu übernehmen und zu bearbeiten (via knöpfchen).
Auf dieser Maske gibt es ein bestimmtes Feld, welches ein konkretes Format bzw Wert vorschreibt (bsp. wird eine DB angesprochen um zu prüfen, ob die ID schon vergeben ist oder nicht). Wenn ID vergeben ist, so wird dieser freundlich darauf hingewiesen etc. Das funktioniert auch alles ganz gut.

Nun will ich aber die Option anbieten, dass er die Eingabe abbrechen kann. Wenn dieser im besagtem Feld drin ist und das Format nicht stimmt UND er will dann den knopf "abbrechen" klickern, springt der Verifer an und gibt die besagte freundliche Meldung aus. Ich will aber nicht, dass er beim abbrechen noch eine Meldung ausgibt, geschweige denn eine DB Prüfung durchführt.

Die Frage ist nun, wie kann ich das umgehen? Auf dem TextField sind ja bestimmte Listener drauf (von Haus aus durch JComponent oder was auch immer). Diese registrieren ja, das ein Focuswechsel stattfinden soll. Irgendwie müsste man diese vielleicht abfragen können, ob das nächste Feld ein JButton ist oder was auch immer und dann darauf reagieren können.

Vielleicht gibt es aber auch eine andere Lösung?
 

André Uhres

Top Contributor
Ich will aber nicht, dass er beim abbrechen noch eine Meldung ausgibt, geschweige denn eine DB Prüfung durchführt.
Wir können z.B. den InputVerifier entfernen: textField.setInputVerifier(null).
Oder einen Boolean "cancelled" auf true setzen und in "verify" abfragen.
 
Zuletzt bearbeitet:

Meru

Bekanntes Mitglied
und wie wird das Event ausgelöst, dass ein Flag/etc. gesetzt wird?
Wenn ich den den Button klicke, dann wird die actionPerformed-Methode >>nicht<< angesprochen, mit der ich ein Flag setzen könnte.
 

André Uhres

Top Contributor
Wenn ich den den Button klicke, dann wird die actionPerformed-Methode >>nicht<< angesprochen, mit der ich ein Flag setzen könnte.
Ich mache bei mir gewöhnlich alle Buttons nicht fokusierbar, da niemand dort navigieren möchte. Daran hatte ich nicht mehr gedacht, sorry:
Java:
button.setFocusable(false);
 

Ebenius

Top Contributor
Ich mache bei mir gewöhnlich alle Buttons nicht fokusierbar, da niemand dort navigieren möchte.
[off topic] Damit würdest Du mich als Nutzer ziemlich verärgern. Ich navigiere oft mit TAB in einen button und drücke SPACE um den Button anzuklicken. Werd ich jetzt auch gleich tun: TAB, TAB, SPACE (auf "Antworten"). Der Griff zur Maus dauert mir viel zu lange.

Ebenius
 

Ebenius

Top Contributor
Meru, Du kannst jedem JComponent mitteilen, ob es beim Empfang des Fokus den InputVerifier des vorherigen Fokuseigentümers prüft. Dieser Mechanismus ist extra für Close-Buttons erfunden worden. Siehe: JComponent.setVerifyInputWhenFocusTarget(boolean).

Ein Beispiel: Der erste Button hat Fokus, der dritte kann geklickt werden, der zweite bekommt den Fokus aber nicht.
Java:
final JPanel contentPane = new JPanel(new GridLayout(0, 1, 6, 6));
final JButton focusedButton = new JButton("Focus Owner");
focusedButton.setInputVerifier(new InputVerifier() {

  @Override
  public boolean verify(JComponent input) {
    return false;
  }
});
contentPane.add(focusedButton);
contentPane.add(new JButton("Don't get Focus"));
final JButton exitButton = new JButton(new AbstractAction("Exit") {

  public void actionPerformed(ActionEvent e) {
    SwingUtilities.getWindowAncestor((Component) e.getSource()).dispose();
  }
});
exitButton.setVerifyInputWhenFocusTarget(false);
contentPane.add(exitButton);

final JFrame f = new JFrame("Fokus Trap");
f.setContentPane(contentPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
Damit gibt's aber ein Problem: Wenn man mit SHIFT+TAB aus dem ersten Button heraus geht (auf Exit), kann man danach auch den zweiten Button drücken. Um das zu verhindern, muss sich der dritte Button darum kümmern, dass er den ersten Button wieder fokusiert, wenn er den Fokus verliert und des ersten Buttons InputVerifier false sagt. Das geht beispielsweise so:
Java:
exitButton.addFocusListener(new FocusAdapter() {

  private WeakReference<JComponent> oldOwnerRef;

  @Override
  public void focusGained(FocusEvent e) {
    final Component oldOwner = e.getOppositeComponent();
    if (oldOwner instanceof JComponent) {
      oldOwnerRef = new WeakReference<JComponent>((JComponent) oldOwner);
    }
  }

  @Override
  public void focusLost(FocusEvent e) {
    final JComponent oldOwner;
    final InputVerifier iv;
    if (oldOwnerRef != null
          && (oldOwner = oldOwnerRef.get()) != null
          && (iv = oldOwner.getInputVerifier()) != null
          && !iv.shouldYieldFocus(oldOwner)) {
      oldOwner.requestFocus();
    }
  }
});
Damit sollte Dein Problem gelöst sein. :)

Ebenius
 

Ebenius

Top Contributor
Falls du damit den Defaultbutton meinst: den können wir mit der Tastatur aktivieren, auch wenn er nicht fokusierbar ist!
Ein Cancel Button ist gewöhnlich an die "Escape" Taste gebunden
Ich meine damit auch den Cancel-Button, oder den Close-Button, oder ... Genau für diese Art Buttons ist die oben erwähnte Methode geschaffen worden. Schließlich sollten diese Buttons auch mit der Maus funktionieren, oder? Selbst wenn der InputVerifier einer anderen Komponente etwas dagegen hat.

Ebenius
 

André Uhres

Top Contributor
Hab ehrlich gesagt keine Lust nachzulesen, was du wo genau wie gemeint hast. Die Sache ist doch klar: Buttons sind in einer normalen Anwendung nicht fokusierbar und funktionieren mit Maus und Tastatur (ausser bei solchen, für die keine Tastenkombination vorgesehen ist, aber niemmand kommt auf die Idee, dann dorthin zu navigieren!).

EDIT: Ich muss mich korrigieren. Das trifft auf Toolbarbuttons zu, bei anderen Buttons hast du recht. Sorry für die Verwechslung.
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
[EDIT] Dein Edit hab ich zu spät gesehen. Meine Antwort bezog sich also noch auf den alten Beitrag. :)

Die Sache ist doch klar: Buttons sind in einer normalen Anwendung nicht fokusierbar
Die Sache ist nicht klar. Buttons (außerhalb von ToolBars) sind in den meisten Anwendungen die ich kenne fokusierbar. Schau in die Preferences im Eclipse, schau im Gimp, schau in den Einstellungen im Opera, die Liste wird lang.

[...] niemmand kommt auf die Idee, dann dorthin zu navigieren!
Ganz sicher doch. In Formularen beispielsweise navigieren viele Menschen mit Tab von Feld zu Feld, dann mit Tab gleich weiter zum Okay-Button. Oder zum Postleitzahl-Auswählen-Button. Oder, oder, oder. Nur weil Du eine bestimmte Verhaltensweise nicht an den Tag legst, heißt das nicht, dass die Verhaltensweise unsinnig ist. Es geht bei GUIs um Gewohnheiten der Benutzer. Und die sind nunmal unterschiedlich. Wenn es ungewöhnlich wäre, dass Buttons fokusierbar wären, wäre ein Button im Swing standardgemäß nicht fokusierbar. Wäre es ungewöhnlich, dass ein Button per TAB / SHIFT-TAB erreichbar wäre, dann würde die DefaultFocusTraversalPolicy die Buttons auslassen.

Woher nimmst Du denn die Annahmen?

Ebenius
 
Zuletzt bearbeitet:

Meru

Bekanntes Mitglied
Ich danke euch beiden für eure Lösungsansätze. Prinzipiell finde ich die Möglichkeit zum aktivieren eines Buttons besser, weil sie so dem Benutzer signalisiert "ich kann etwas abbrechen". Ist kein Button vorhanden bzw deaktiviert, so weiß er nicht mehr weiter und ruft promt den Support oder was auch immer an oder gar besten fall schließt er das Programm und macht es wieder neu auf um nicht in den "Bearbeitungs-Modus" zu wechseln. Man kann den Benutzer zwar sagen "Hey, drücke ESC", aber das ist in meinen Augen nicht wirklich transparent. Ich denke da an die normalen Bürofrauen auf meiner Arbeit, sie schubsen immer die Maus ;)

Jedenfalls vielen lieben dank für eure Beiträge, ich werde das morgen versuchen in die Tat umzusetzen :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Eingabensteuerung mit Textfield AWT, Swing, JavaFX & SWT 20
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
K JavaFX Taschenrechner textField auf 10stellen begrenzen AWT, Swing, JavaFX & SWT 26
Z textField.getText = null AWT, Swing, JavaFX & SWT 15
officialmaxl JavaFX Textfield getTextfield() in String speichern AWT, Swing, JavaFX & SWT 1
L Swing Wert vom Textfield in Array List hinzufügen AWT, Swing, JavaFX & SWT 2
R Textfield lässt sich nicht positionieren AWT, Swing, JavaFX & SWT 1
B JavaFX ListView in Kombination mit TextField AWT, Swing, JavaFX & SWT 5
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
L JavaFX Ich suche das passende Textfield Event AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX JFoenix TextField KeyEvent AWT, Swing, JavaFX & SWT 2
F JavaFX Aktuelle Zeit in einem TextField anzeigen AWT, Swing, JavaFX & SWT 7
F JavaFX textField Ausgabe automatisch kopieren AWT, Swing, JavaFX & SWT 7
M JavaFX String aus TextField reagiert nicht wie erwartet AWT, Swing, JavaFX & SWT 3
S JavaFX TextField auf Datentyp prüfen AWT, Swing, JavaFX & SWT 1
M JavaFX .setCellFactory () mit TextField AWT, Swing, JavaFX & SWT 4
L TextField Listener AWT, Swing, JavaFX & SWT 13
L TextField Eingabe in andere GUI übernehmen AWT, Swing, JavaFX & SWT 1
C JavaFX mit .setText() befülltes Textfield liefert anschließend mit .getText() den ursprünglichen Wert? AWT, Swing, JavaFX & SWT 1
K JavaFX Combobox, Textfield & setOnMouseClicked AWT, Swing, JavaFX & SWT 2
U Java FX Warten auf Textfield eingabe AWT, Swing, JavaFX & SWT 17
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
S Buttons und TextField automatisch vergrößern AWT, Swing, JavaFX & SWT 8
Y Listview Textfield vergrößern, Schrift anpassen AWT, Swing, JavaFX & SWT 0
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
U Eingabe von TextField in variable speichern AWT, Swing, JavaFX & SWT 2
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
I JavaFX TextField auf Eingabe prüfen AWT, Swing, JavaFX & SWT 3
D JavaFX Nur Zahlen in Textfield AWT, Swing, JavaFX & SWT 4
D Textfield bei starten füllen. AWT, Swing, JavaFX & SWT 5
H Textfield bleibt im Hintergrund AWT, Swing, JavaFX & SWT 2
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
P LayoutManager TextField.setSize(); in einem FlowLayout AWT, Swing, JavaFX & SWT 3
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
U Swing NullPointerException trotz Referenz auf Textfield & Button AWT, Swing, JavaFX & SWT 6
S LayoutManager TextField verschwindet / wird klein AWT, Swing, JavaFX & SWT 4
S Button in Textfield ziehen AWT, Swing, JavaFX & SWT 4
T Einen Variablen Wert in einem TextField AWT, Swing, JavaFX & SWT 4
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
F Swing TextField Eingabe in Variable umwandeln um zum Beispiel zu rechnen. AWT, Swing, JavaFX & SWT 3
G JavaFX TextField Eingabe formatieren/einschränken AWT, Swing, JavaFX & SWT 2
C Integer in ein Textfield schreiben. AWT, Swing, JavaFX & SWT 4
P TextField beim klicken von JButton speichern AWT, Swing, JavaFX & SWT 17
C Swing TextField auslesen AWT, Swing, JavaFX & SWT 21
MiMa Integer Zahl in Textfield ausgeben AWT, Swing, JavaFX & SWT 12
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
B JComboBox ans Textfield gelangen AWT, Swing, JavaFX & SWT 4
A Größe von Textfield bestimmen AWT, Swing, JavaFX & SWT 9
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
T jPanels im jFrame bewegen - Auch ohne Textfield? AWT, Swing, JavaFX & SWT 4
B AWT Mit TextField Zahlen einlesen lassen AWT, Swing, JavaFX & SWT 34
R Textfield auslesen auf Anforderung AWT, Swing, JavaFX & SWT 4
A Button und Textfield AWT, Swing, JavaFX & SWT 4
A TextField und Label AWT, Swing, JavaFX & SWT 8
H gui textfield AWT, Swing, JavaFX & SWT 5
A TextField: Textfeld teilweise editierbar AWT, Swing, JavaFX & SWT 2
R TextField auslesen & in Objekteigenschaften speichern AWT, Swing, JavaFX & SWT 22
E Button in TextField eibetten? AWT, Swing, JavaFX & SWT 4
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
W textfield zentriert AWT, Swing, JavaFX & SWT 2
N Swing Textfield listener AWT, Swing, JavaFX & SWT 2
H Zeich in einem TextField farblich markieren?! AWT, Swing, JavaFX & SWT 5
D Swing [BoxLayout] Nur TextArea und nicht TextField vergroessen AWT, Swing, JavaFX & SWT 2
D Textfield auswerten AWT, Swing, JavaFX & SWT 4
B setText() auf TextField mit Document AWT, Swing, JavaFX & SWT 2
G Problem mit Textfield AWT, Swing, JavaFX & SWT 2
G Den Inhalt von einem Textfield aktualisieren AWT, Swing, JavaFX & SWT 6
D Inhalt von Textfield nach ComboBox AWT, Swing, JavaFX & SWT 2
E Swing Button ActionListener Infos aus Textfield und ComboBox AWT, Swing, JavaFX & SWT 3
G TextField im Hintergrund AWT, Swing, JavaFX & SWT 2
Z TextField aus ActionListener von JButton verändern AWT, Swing, JavaFX & SWT 10
O ComboBox hinter TextField? AWT, Swing, JavaFX & SWT 8
T Checkbox & Textfield AWT, Swing, JavaFX & SWT 5
M Beschränkung auf Nur-Zahleneingabe in Textfield klappt nicht AWT, Swing, JavaFX & SWT 3
N Textfield feste größe? AWT, Swing, JavaFX & SWT 1
M Datum Textfield AWT, Swing, JavaFX & SWT 6
S TextField fehler AWT, Swing, JavaFX & SWT 3
D Problem mit TextField AWT, Swing, JavaFX & SWT 22
C Textfield Background auf Standard zurücksetzen AWT, Swing, JavaFX & SWT 2
V keyListener soll textfield adden AWT, Swing, JavaFX & SWT 2
R TextField bringt NullPointerException bei setVisible() AWT, Swing, JavaFX & SWT 12
J JComboBox Eintrag soll TextField aktualisieren AWT, Swing, JavaFX & SWT 3
P Komponentenentwicklung mit TextField und Label AWT, Swing, JavaFX & SWT 10
K Problem mit TextField Strings AWT, Swing, JavaFX & SWT 2
S Textfield nummer merken AWT, Swing, JavaFX & SWT 3
M problem mit textfield-aktualisierung AWT, Swing, JavaFX & SWT 4
S Fehler beim Auslesen des Textes im textfield AWT, Swing, JavaFX & SWT 8
G Zugriff auf TextField geht nicht AWT, Swing, JavaFX & SWT 5
V Werte aus TextField in eine andere Klasse? AWT, Swing, JavaFX & SWT 2
M Textfield AWT, Swing, JavaFX & SWT 8
S "größeres Problem" mit JComboBox und Textfield AWT, Swing, JavaFX & SWT 35
P [TextField] cursor setzten AWT, Swing, JavaFX & SWT 2
S Eingabe einschränken bei TextField AWT, Swing, JavaFX & SWT 19
S AWT: Probleme mit TextField AWT, Swing, JavaFX & SWT 4
S TextField: Zeilenumbrüche AWT, Swing, JavaFX & SWT 3
E Zeilenumbruch in einem AWT TextField AWT, Swing, JavaFX & SWT 2
F requestFocus() auf ein TextField AWT, Swing, JavaFX & SWT 6
E ausgelesener String wird in Textfield nicht angezeigt AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben