Gui Focus von JTextField weglenken

xYurisha

Mitglied
Hallo liebe Leute,

ich bin gerade in der Freizeit dabei ein bisschen mit GUI's rum zubasteln. Dafür habe ich eine GUI erstellt, womit es später möglich sein wird, sein BMI zu berechnen.
Für die Eingabe des Gewichtes & der Größe habe ich zwei JTextfelder erstellt und diese mit den Text versehen "Eingabe Gewicht/Größe", so bald man auf das jeweilige Feld klickt verschwindet der Text und es kann eine Eingabe getätigt werden. Das Problem was ich habe sieht dabei so aus, dass sobald ich die Anwendung starte bereits das erste Feld ausgewählt ist und man direkt etwas eintippen kann, was ja nicht sein sollte da man ja so der Text mit "Gebe z.B Größe an" nicht mehr sichtbar ist. Ich möchte das beim starten der Anwendung kein Textfeld ausgewählt wird.
Ich habe bereits probiert ein Focus auf ein Bottom beim erstellen der GUI zu lenken, dass hat aber nicht funktoniert.

Wisst ihr was ich machen kann?

Ps. Danke schon mal für eure Hilfe!

Code:

Java:
public class Gui {

public Gui()
{   final int size = 650;

    JPanel container = new JPanel(null);//JPanel wird erstellt mit NULL-LayoutManager
    
    //*Fenster wird erstellt*//
     JFrame fenster = new JFrame("BMI-Rechner");
     fenster.setSize(size, size);
     fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     fenster.setLocationRelativeTo(null);
     fenster.setContentPane(container);//Panel wird JFrame als Con übergeben
    
     //*Buttons und Textfelder werden erstellt*//
     JButton b1 = new JButton("Berechne!");// Button um BMI zu berechnen
     b1.setBounds(450,500,140,50);
    
     JTextField gField = new JTextField("Gib hier dein Gewicht ein!");
     gField.setBounds(100, 150, 140, 50);
     gField.addFocusListener(new FocusAdapter(){
         public void focusGained(FocusEvent e){
             JTextField source = (JTextField)e.getComponent();
             source.setText("");
         }
        
         public void focusLost(FocusEvent e){
             JTextField source = (JTextField)e.getComponent();
             source.setText("Gib hier dein Gewicht ein!");
         }
     });
    
     JTextField hField = new JTextField("Gib hier deine Größe ein!");
     hField.setBounds(100, 250, 140, 50);
     hField.addFocusListener(new FocusAdapter(){
         public void focusGained(FocusEvent e){
             JTextField source = (JTextField)e.getComponent();
             source.setText("");
         }
        
         public void focusLost(FocusEvent e){
             JTextField source = (JTextField)e.getComponent();
             source.setText("Gib hier deine Größe ein!");
         }
     });
    
    
     //*Buttons werden Panel übergeben und Fenster wird sichtbar gemacht*//
     container.add(b1);
     container.add(hField);
     container.add(gField);
     fenster.setVisible(true);
     b1.requestFocus();
}
 

mihe7

Top Contributor
Also der Focus-Request funktioniert bei mir wunderbar. Die Lösung von @Robat funktioniert, wenn vorher pack() aufgerufen wurde.

Mal ein Beispiel, das zwei Ansätze enthält:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Gui {

    private class DocumentChangeHandler implements DocumentListener {
        private ChangeListener callback;

        public DocumentChangeHandler(ChangeListener callback) {
            this.callback = callback;
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            callback.stateChanged(new ChangeEvent(e));
        }
        @Override
        public void removeUpdate(DocumentEvent e) {
            callback.stateChanged(new ChangeEvent(e));
        }
        @Override
        public void insertUpdate(DocumentEvent e) {
            callback.stateChanged(new ChangeEvent(e));
        }            
    }

    public Gui() {
        final int size = 650;

        JPanel container = new JPanel(null);//JPanel wird erstellt mit NULL-LayoutManager
        
        //*Fenster wird erstellt*//
        JFrame fenster = new JFrame("BMI-Rechner");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setContentPane(container);//Panel wird JFrame als Con übergeben
        
        //*Buttons und Textfelder werden erstellt*//
        JButton b1 = new JButton("Berechne!");// Button um BMI zu berechnen
        b1.setBounds(450,500,140,50);
        
        JTextField gField = new JTextField();
        gField.setBounds(100, 150, 140, 50);
        addPrompt(gField, "Gib hier Dein Gewicht ein!");

        JTextField hField = new JTextField();
        hField.setBounds(100, 250, 140, 50);
        addPrompt(hField, "Gib hier deine Größe ein!");
        
        //*Buttons werden Panel übergeben und Fenster wird sichtbar gemacht*//
        container.add(b1);
        container.add(hField);
        container.add(gField);
        fenster.pack();
        b1.requestFocusInWindow();
        fenster.setSize(size, size);
        fenster.setLocationRelativeTo(null);
        fenster.setVisible(true);
    } 

    private void addPrompt(JTextField tf, String prompt) {
        final JLabel label = new JLabel(prompt);
        label.setFont(tf.getFont());
        label.setForeground(Color.GRAY);
        label.setSize(tf.getSize());        
        label.setLocation(tf.getInsets().left, 0);
        tf.add(label);
        tf.getDocument().addDocumentListener(
            new DocumentChangeHandler(e -> label.setVisible(tf.getText().isEmpty())));
    }

    public static void main(String[] args) {
        new Gui();
    }
}
 

xYurisha

Mitglied
Ruf b1.requestFocusInWindow() vor frame.setVisible(true) auf
Danke dir!
Also der Focus-Request funktioniert bei mir wunderbar. Die Lösung von @Robat funktioniert, wenn vorher pack() aufgerufen wurde.

Mal ein Beispiel, das zwei Ansätze enthält:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Gui {

    private class DocumentChangeHandler implements DocumentListener {
        private ChangeListener callback;

        public DocumentChangeHandler(ChangeListener callback) {
            this.callback = callback;
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            callback.stateChanged(new ChangeEvent(e));
        }
        @Override
        public void removeUpdate(DocumentEvent e) {
            callback.stateChanged(new ChangeEvent(e));
        }
        @Override
        public void insertUpdate(DocumentEvent e) {
            callback.stateChanged(new ChangeEvent(e));
        }         
    }

    public Gui() {
        final int size = 650;

        JPanel container = new JPanel(null);//JPanel wird erstellt mit NULL-LayoutManager
     
        //*Fenster wird erstellt*//
        JFrame fenster = new JFrame("BMI-Rechner");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setContentPane(container);//Panel wird JFrame als Con übergeben
     
        //*Buttons und Textfelder werden erstellt*//
        JButton b1 = new JButton("Berechne!");// Button um BMI zu berechnen
        b1.setBounds(450,500,140,50);
     
        JTextField gField = new JTextField();
        gField.setBounds(100, 150, 140, 50);
        addPrompt(gField, "Gib hier Dein Gewicht ein!");

        JTextField hField = new JTextField();
        hField.setBounds(100, 250, 140, 50);
        addPrompt(hField, "Gib hier deine Größe ein!");
     
        //*Buttons werden Panel übergeben und Fenster wird sichtbar gemacht*//
        container.add(b1);
        container.add(hField);
        container.add(gField);
        fenster.pack();
        b1.requestFocusInWindow();
        fenster.setSize(size, size);
        fenster.setLocationRelativeTo(null);
        fenster.setVisible(true);
    }

    private void addPrompt(JTextField tf, String prompt) {
        final JLabel label = new JLabel(prompt);
        label.setFont(tf.getFont());
        label.setForeground(Color.GRAY);
        label.setSize(tf.getSize());     
        label.setLocation(tf.getInsets().left, 0);
        tf.add(label);
        tf.getDocument().addDocumentListener(
            new DocumentChangeHandler(e -> label.setVisible(tf.getText().isEmpty())));
    }

    public static void main(String[] args) {
        new Gui();
    }
}

Danke auch an dich, für deine Hilfe. Könntest du mir vlt. nochmal die pack Methode erläutern ? Ich verstehe sie nur so grob und weiß nicht warum sie hier nötig ist, bzw. warum ich auch setSize und setLocation hinter den pack setzen muss.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Dazu muss man erst mal verstehen, wie AWT funktioniert, auf dem Swing basiert (AWT kam vor Swing).

In AWT werden native Komponenten dargestellt. Dazu müssen die Java-Klassen wie z. B. Button auf ihr natives Pendant zugreifen können. Um AWT möglichst einfach auf verschiedenen Plattformen zugänglich machen zu können, wurde davon abstrahiert. Die Java-Klassen greifen über definierte Schnittstellen auf sog. Peer-Komponenten zu, das können native Komponenten oder auch leichtgewichtige Komponenten (Swing) sein.

Ein AWT-Button benötigt ein Objekt (die Peer-Komponente), die eine ButtonPeer-Schnittstelle implementiert. Die Implementierung ist natürlich abhängig von der jeweiligen Plattform (Windows, ...).

So lange eine Komponente über keine Peer-Komponente verfügt, gilt sie als noch nicht "realisiert". requestFocusInWindow() funktioniert nur, wenn das Fenster realisiert ist. pack() realisiert unter anderem das Fenster, ohne es anzuzeigen.

Wenn Du also requestFocusInWindow() verwenden willst, ohne das Fenster vorher anzuzeigen, musst Du pack() aufrufen (theoretisch sollte es auch via addNotify() funktionieren, die Methode soll aber in Anwendungen nicht verwendet werden).

bzw. warum ich auch setSize und setLocation hinter den pack setzen muss.
Weil pack() die Größe des Fensters so einstellt, dass die Komponenten möglichst mit ihrer bevorzugten Größe dargestellt werden können.
 

xYurisha

Mitglied
Dazu muss man erst mal verstehen, wie AWT funktioniert, auf dem Swing basiert (AWT kam vor Swing).

In AWT werden native Komponenten dargestellt. Dazu müssen die Java-Klassen wie z. B. Button auf ihr natives Pendant zugreifen können. Um AWT möglichst einfach auf verschiedenen Plattformen zugänglich machen zu können, wurde davon abstrahiert. Die Java-Klassen greifen über definierte Schnittstellen auf sog. Peer-Komponenten zu, das können native Komponenten oder auch leichtgewichtige Komponenten (Swing) sein.

Ein AWT-Button benötigt ein Objekt (die Peer-Komponente), die eine ButtonPeer-Schnittstelle implementiert. Die Implementierung ist natürlich abhängig von der jeweiligen Plattform (Windows, ...).

So lange eine Komponente über keine Peer-Komponente verfügt, gilt sie als noch nicht "realisiert". requestFocusInWindow() funktioniert nur, wenn das Fenster realisiert ist. pack() realisiert unter anderem das Fenster, ohne es anzuzeigen.

Wenn Du also requestFocusInWindow() verwenden willst, ohne das Fenster vorher anzuzeigen, musst Du pack() aufrufen (theoretisch sollte es auch via addNotify() funktionieren, die Methode soll aber in Anwendungen nicht verwendet werden).


Weil pack() die Größe des Fensters so einstellt, dass die Komponenten möglichst mit ihrer bevorzugten Größe dargestellt werden können.

Ah vielen dank, ich verstehe :D! Ich werde mich dann nochmal genauer in die AWT-Materie rein lesen um es besser zu verstehen. Deine Erklärung hat mir jedenfalls gut geholfen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T bekomme keinen Focus auf JTextField AWT, Swing, JavaFX & SWT 3
H Swing JTextField in JWindow, JWindow bekommt focus zurück? AWT, Swing, JavaFX & SWT 9
D Beim Starten ein JTextfield Focus geben AWT, Swing, JavaFX & SWT 7
O JTextField- Selection / Focus bei nicht editierbaren Feldern AWT, Swing, JavaFX & SWT 2
V JTextField Focus Cursor setzen AWT, Swing, JavaFX & SWT 2
E Focus auf titledborder AWT, Swing, JavaFX & SWT 8
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
O Focus zwischen Chat und Spiel wechselns AWT, Swing, JavaFX & SWT 3
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
K JavaFX Focus Listener für gesamte Scene AWT, Swing, JavaFX & SWT 1
C JOptionPane.showConfirmDialog() -> Focus auf NEIN -> Enter gibt YES_OPTION zurück AWT, Swing, JavaFX & SWT 6
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
B Swing JTextfeld bekommt nur jedes Zweite mal Focus AWT, Swing, JavaFX & SWT 11
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
D ComboBoxCellEditor Refresh beim Focus AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
A Focus Problem AWT, Swing, JavaFX & SWT 4
I focus an ein jdialog geben AWT, Swing, JavaFX & SWT 3
B JInternalFrame Focus setzten geht nicht AWT, Swing, JavaFX & SWT 2
A Swing Focus auf gemalte Component AWT, Swing, JavaFX & SWT 5
M Swing Focus für Buttons deaktiviert --> keine Reaktion mehr auf Tastendrücke AWT, Swing, JavaFX & SWT 5
M focus subFrame AWT, Swing, JavaFX & SWT 3
G Force Focus für JButton AWT, Swing, JavaFX & SWT 2
lumo SWT Composite Focus AWT, Swing, JavaFX & SWT 2
T disabled Checkbox soll trotzdem Focus bekommen AWT, Swing, JavaFX & SWT 9
C Swing Focus Management AWT, Swing, JavaFX & SWT 3
lumo SWT Table Selection Color +Focus Out AWT, Swing, JavaFX & SWT 14
H Swing Focus bekommen AWT, Swing, JavaFX & SWT 4
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
L AWT Focus auf Fenster setzen AWT, Swing, JavaFX & SWT 4
H warum kann ich das focus event nicht abfangen ? AWT, Swing, JavaFX & SWT 5
L Swing Input Focus eines JTextFields in einer JList AWT, Swing, JavaFX & SWT 2
A Focus in JTable Cell AWT, Swing, JavaFX & SWT 3
A Focus für JApplet AWT, Swing, JavaFX & SWT 7
R Focus ermitteln AWT, Swing, JavaFX & SWT 2
C JTable Focus Handling AWT, Swing, JavaFX & SWT 2
Nitram Swing Focus im JFrame AWT, Swing, JavaFX & SWT 10
I Swing Focus Listener bei PComboBox von pswing Erweiterung AWT, Swing, JavaFX & SWT 7
V Swing Problem mit Focus setzen AWT, Swing, JavaFX & SWT 7
thE_29 Swing JTabbedPane Focus von Komponenten außerhalb AWT, Swing, JavaFX & SWT 10
B JTable getselectedrow liefert -1 wenn Focus verloren AWT, Swing, JavaFX & SWT 4
S Versuch den Focus zu klauen detektieren? AWT, Swing, JavaFX & SWT 14
SebSnake JFrame "Focus" erzwingen (wie JOptionPane) AWT, Swing, JavaFX & SWT 3
V JTabbedPane - keine "Focus"-Box auf selektiertem T AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
O Focus im GBL steuern. AWT, Swing, JavaFX & SWT 3
K Focus an das JPanel übergeben AWT, Swing, JavaFX & SWT 2
K Focus-Problem AWT, Swing, JavaFX & SWT 9
O TextBoxen Focus über Pfeiltasten steuern AWT, Swing, JavaFX & SWT 3
G Problene mt Focus unter Swing AWT, Swing, JavaFX & SWT 7
G JTable und Focus AWT, Swing, JavaFX & SWT 30
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
P TextFeld Focus entfernen AWT, Swing, JavaFX & SWT 2
F Problem mit Actions, TextComponents und Focus AWT, Swing, JavaFX & SWT 2
K Focus mit Mouseclick auf JPanel setzen AWT, Swing, JavaFX & SWT 4
D Focus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
B JTable - Focus - TabTaste AWT, Swing, JavaFX & SWT 2
D Focus in bestimmter Celle in JTable AWT, Swing, JavaFX & SWT 3
B Komponente in JTable bekommt keinen Focus AWT, Swing, JavaFX & SWT 3
M Focus beim öffnen eines neuen JFrames AWT, Swing, JavaFX & SWT 6
J Focus auf JFrame AWT, Swing, JavaFX & SWT 3
B Focus für Textfeld AWT, Swing, JavaFX & SWT 5
B im JTree Focus setzen und navigieren AWT, Swing, JavaFX & SWT 3
B JInternalFrame in den Vordergrund rücken + Focus AWT, Swing, JavaFX & SWT 15
D JTable: Focus auf Zelle markiert ihren Text zum editieren AWT, Swing, JavaFX & SWT 2
C Komponente mit Focus bevor JButton-Klick merken. AWT, Swing, JavaFX & SWT 6
L Focus setzen AWT, Swing, JavaFX & SWT 3
G JTabbedPane, Focus, ChangeListener AWT, Swing, JavaFX & SWT 1
B Focus in JOptionPane AWT, Swing, JavaFX & SWT 2
J Focus-Problem bei Vollbildmodus AWT, Swing, JavaFX & SWT 7
A Combobox Focus-Events, Tab in Tabelle AWT, Swing, JavaFX & SWT 7
F Fenster in den Vordergrund aber nicht im Focus AWT, Swing, JavaFX & SWT 21
O Abfrage ob eine bstimmte Komponente den Focus hat AWT, Swing, JavaFX & SWT 4
T JTable Focus auf Zelle setzen AWT, Swing, JavaFX & SWT 3
R Focus durch "tabben" von JTable Zelle auf andere K AWT, Swing, JavaFX & SWT 8
R Focus speeren AWT, Swing, JavaFX & SWT 2
K JList - merkwürdiges Verhalten bei Leertaste (unter Focus) AWT, Swing, JavaFX & SWT 7
W Components Focus mit TAB-Taste VERTIKAL bewegen AWT, Swing, JavaFX & SWT 4
D jcolorchooser - lost focus AWT, Swing, JavaFX & SWT 2
R Focus auf bereits geöffnetes Fenster setzen AWT, Swing, JavaFX & SWT 9
O Welche Möglichkeit zum Focus setzen! AWT, Swing, JavaFX & SWT 2
R JMenu copy Focus-Problem AWT, Swing, JavaFX & SWT 2
M Focus einstellen AWT, Swing, JavaFX & SWT 3
G Focus so setzen, daß in einer jTextArea der Cursor blinkt AWT, Swing, JavaFX & SWT 7
G JTable: Rahmen bei Focus um Zelle AWT, Swing, JavaFX & SWT 2
thE_29 Modaler Dialog - close on not focus AWT, Swing, JavaFX & SWT 3
P Focus auf JFrame AWT, Swing, JavaFX & SWT 5
G JOptionPane verliert Focus AWT, Swing, JavaFX & SWT 3
A JTree Problem mit Focus bzw. Selection AWT, Swing, JavaFX & SWT 5
C Focus setzen AWT, Swing, JavaFX & SWT 2
G JTree Focus setzen AWT, Swing, JavaFX & SWT 2
F HILFE!!! Focus-Probleme bei unterschiedlichen Panel's AWT, Swing, JavaFX & SWT 3
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
I JTextfield senden über Enter AWT, Swing, JavaFX & SWT 1
H Swing Wie Fokus von JTextField entfernen? AWT, Swing, JavaFX & SWT 9
M mehrere jTextField untereinander AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben