Herkunft des Fokus erkennbar (via Klick oder Tab-Steuerung)?

Status
Nicht offen für weitere Antworten.

Novanic

Bekanntes Mitglied
Hi,

weiß jemand wie man am Besten erkennen kann wodurch ein GUI-Element (in meinem Fall ein JTextField) den Fokus bekommen hat? Meine Textfelder haben Standardwerte und wenn jemand per Tab-Steuerung (FocusTraversal) in das Feld navigiert, sollte der Caret an der ersten Position und nicht an der letzten Position stehen. Mit einem FocusListener kann man den Caret aber nicht einfach umsetzen, weil der Caret sonst auch bei einem normalen Klick in das Textfeld umgesetzt werden würde.

Hat jemand eine Idee wie man das (vernünftig) unterscheiden kann?

Danke schonmal.

Gruß Sven
 

Ebenius

Top Contributor
Mit der TraversalPolicy würde ich die Funktionalität nicht verbinden wollen. Du möchtest ein Textfeld, welches, falls es den Fokus per TAB bekommt, [c]selectAll()[/c] ruft, nicht aber, wenn jemand mit der Maus draufklickt... Ich würde das so machen:
Java:
/* (@)FocusTestGUI.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.text.JTextComponent;

/**
 * @version $Revision$ as of $Date$
 * @author Sebastian Haufe
 */
public class FocusTestGUI {

  private static class MouseFocusListener extends FocusAdapter
    implements MouseListener {

    private long lastMouseDown;

    @Override
    public void focusGained(FocusEvent e) {
      if (lastMouseDown != EventQueue.getMostRecentEventTime()) {
        final Component comp = e.getComponent();
        if (comp instanceof JTextComponent) {
          ((JTextComponent) comp).selectAll();
        }
      }
    }

    public void mouseClicked(MouseEvent e) {}

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {
      lastMouseDown = e.getWhen();
    }

    public void mouseReleased(MouseEvent e) {}
  }

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    final JTextField tf1 = new JTextField(40);
    final JTextField tf2 = new JTextField(40);

    final MouseFocusListener focusListener = new MouseFocusListener();
    tf1.addFocusListener(focusListener);
    tf1.addMouseListener(focusListener);
    tf2.addFocusListener(focusListener);
    tf2.addMouseListener(focusListener);

    final JPanel contentPane = new JPanel(new GridLayout(0, 1, 6, 6));
    contentPane.add(tf1);
    contentPane.add(tf2);

    final JFrame f = new JFrame("Test Frame: FocusTestGUI"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
Ebenius
 

Novanic

Bekanntes Mitglied
Hi,

danke für die Antworten. Der Code sieht sehr gut und übersichtlich aus, mich beunruhigt aber der Vergleich mit EventQueue#getMostRecentEventTime(). Das sehe ich so zum ersten mal. Ist der Vergleich sicher? Die EventQueue behandelt ja wahrscheinlich die Events von allen GUI-Komponenten. Könnten da nicht irgendwelche anderen Events dazwischen funken, die garkeine Relevanz für die Prüfung haben?

Danke schonmal.

Gruß Sven
 

Ebenius

Top Contributor
Da nur InputEvents eine Zeitangabe haben und da ein KeyEvent genau wie ein MouseEvent ein InputEvent ist, würde sich bei einer Tastatureingabe eine andere MostRecentEventTime befinden als der letzte MouseEvent hatte. Ich halte den Test daher für sicher.

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M KeyEvent ohne Fokus konsumieren AWT, Swing, JavaFX & SWT 1
H Swing Wie Fokus von JTextField entfernen? AWT, Swing, JavaFX & SWT 9
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
C SWT MenuBar & MenuItems Fokus wenn F10 unterdrücken/entfernen AWT, Swing, JavaFX & SWT 9
1 Swing Bestimme ob ein Subelement eines panel den Fokus verloren hat AWT, Swing, JavaFX & SWT 2
B Swing Fokus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
J Swing Fokus JInternalFrame fehlerhaft AWT, Swing, JavaFX & SWT 4
B Fokus markierung entfernen AWT, Swing, JavaFX & SWT 2
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
A Vordergrund und Fokus setzten oder Modales Einabefeld AWT, Swing, JavaFX & SWT 28
G SWT Fokus auf MsgBox setzen AWT, Swing, JavaFX & SWT 3
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
J Swing Wie Fokus richtig setzen? AWT, Swing, JavaFX & SWT 7
T Swing Fokus AWT, Swing, JavaFX & SWT 2
I Swing Wie bekomme ich den Fokus für einen JPanel AWT, Swing, JavaFX & SWT 5
H Swing Problem mit FocusCycleRoot, der FocusTraversalPolicy und dem Fokus AWT, Swing, JavaFX & SWT 2
G Problem beim setzen des Fokus AWT, Swing, JavaFX & SWT 4
E Swing Mit rechter Maustaste Fokus in JList setzen?! AWT, Swing, JavaFX & SWT 3
F Rechte Maustaste auf TreeNode soll den Fokus auf diese setzen AWT, Swing, JavaFX & SWT 6
agent47 Swing auf Schnelltaste ohne Fokus hören AWT, Swing, JavaFX & SWT 2
M JSpinner als TableCellEditor; buttons nur bei fokus sichtbar AWT, Swing, JavaFX & SWT 14
Z Fokus auf Eingabefeld bei showMessageDialog setzen AWT, Swing, JavaFX & SWT 3
F Panel kann nicht Fokus erhalten AWT, Swing, JavaFX & SWT 2
N Textfeld füllen sobald es den Fokus verliert AWT, Swing, JavaFX & SWT 2
D JTable, Model, Fokus AWT, Swing, JavaFX & SWT 3
multiholle AWT Hotkey ohne Fokus AWT, Swing, JavaFX & SWT 6
W JTextArea/TextArea kriegt keinen Fokus AWT, Swing, JavaFX & SWT 6
T Fokus auf CB in Table mit beliebiger Taste AWT, Swing, JavaFX & SWT 12
G JOptionPane.showInputDialog(): Texteingabe und Fokus AWT, Swing, JavaFX & SWT 3
V Kein Fokus für Key Bindings auf JPanel bzw JApplet AWT, Swing, JavaFX & SWT 2
R Fokus von GUI-Elementen AWT, Swing, JavaFX & SWT 3
F Herausfinden, auf welchem Objekt der Fokus liegt AWT, Swing, JavaFX & SWT 2
V JTable verliert Fokus, wie offene Zelle schliessen? AWT, Swing, JavaFX & SWT 5
S Eventhandling obwohl Fenster nicht im Fokus AWT, Swing, JavaFX & SWT 5
GilbertGrape bei "Enter" Funktion ausführen, egal wo der Fokus AWT, Swing, JavaFX & SWT 2
A Fokus in ein Textfeld setzen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A ComboBox soll reagieren ohne fokus AWT, Swing, JavaFX & SWT 7
C Probleme einem JPanel den Fokus zuzuweisen AWT, Swing, JavaFX & SWT 2
A Fokus und JTextField AWT, Swing, JavaFX & SWT 35
T JList mit eigenem TransferHandler: Fokus(?)-Probleme AWT, Swing, JavaFX & SWT 4
D JButton mit Fokus soll auf ENTER reagieren AWT, Swing, JavaFX & SWT 3
M Frame erhält ungewollt den Fokus AWT, Swing, JavaFX & SWT 10
V JTable Handling Fokus on Keystroke und Maus Doubleclick AWT, Swing, JavaFX & SWT 9
S JTextArea mit Scrollbar,append Text mit Fokus? AWT, Swing, JavaFX & SWT 5
G Event, wenn JTextField Fokus verliert? AWT, Swing, JavaFX & SWT 2
C Der hartnäckige Fokus AWT, Swing, JavaFX & SWT 3
G Keylistener/Fokus Problem AWT, Swing, JavaFX & SWT 3
B Fokus Problem unter Linux AWT, Swing, JavaFX & SWT 7
J JFrame und Fokus AWT, Swing, JavaFX & SWT 4
N Fokus Reihenfolge ändern AWT, Swing, JavaFX & SWT 12
M Fokus auf ein JTextfield in einem JDialog setzen AWT, Swing, JavaFX & SWT 6
I fokus AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben