Fokus für KeyListener

MK234

Aktives Mitglied
Hallo,

ich programmiere gerade eine GUI, welche mehrere Buttons hat.
Mein Drücken des Leertaste sowie beim Drücken eines bestimmten Buttons soll eine bestimmte Funktion ausgeführt werden.

Leider habe ich das Problem, daß beim Drücken der Leertaste nur dann die gewünschte Funktion ausgeführt wird, wenn ich kurz zuvor auch auf den bestimmten Button gedrückt habe, ansonsten wird beim Drücken dieser Taste immer die Funktion des zuletzt gedrückten Buttons ausgeführt.

Nach meinen bisherigen Recherchen muß ich anscheinend den Button mit dieser Leertaste fokkusieren. Aber wie mache ich das in meinem Programm?


In der Klasse GUI werden die Buttons wie folgt programmiert:
Java:
public class GUI extends JFrame implements  ActionListener {
…...
…..

	private Action action;
…....
…....
	JPanel v2Box = new JPanel(new GridLayout(3, 1));
        	autoButton = new JButton("automatisch");
        	autoButton.setActionCommand("auto");
        	autoButton.addActionListener(action);
        	autoButton.setEnabled(true);
       	 v2Box.add(autoButton);
        
        	manuButton = new JButton("manuell");
        	manuButton.setActionCommand("manu");
        	manuButton.addActionListener(action);
        	manuButton.setEnabled(true);
        	v2Box.add(manuButton);        

	spaceButton = new JButton("Leertaste");
        	spaceButton.addKeyListener(action);
       
        	spaceButton.setActionCommand("leer");
        	spaceButton.addActionListener(action);
        	spaceButton.setEnabled(true);
        	v2Box.add(spaceButton);



In der Klasse Action werden dann die folgenden Funktionen ausgeführt:

public class Action extends JComponent implements ComponentListener,
        ActionListener, KeyListener {
…......
….......

 public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand() == "auto") {
            manuell = false;
            enterGedr = false;
            System.out.println("auto gedrueckt  " + manuell);
           
        }
        else if (e.getActionCommand() == "manu") {
            manuell = true;
            enterGedr = false;
            System.out.println("manu gedrueckt  " + manuell);
            
        }
        else if (e.getActionCommand() == "leer") {
            enterGedr = true;
            System.out.println("Leer gedrueckt");
        }
    }
    
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            enterGedr = true;
            System.out.println("Leertaste gedrueckt");
        }
            
    }
    
    public void keyTyped(KeyEvent e) {}
    
    public void keyReleased(KeyEvent e) {}
}
 
Zuletzt bearbeitet von einem Moderator:
Erweitere die Input und Actionmap

Außerdem würde ich es nicht so kompliziert machen, sondern jeder Componente einen eigenen Listener geben.
Warum erbt Action von JComponent?
 
Zuletzt bearbeitet von einem Moderator:
"requestFocus()" habe ich inzwischen probiert. Hat leider nicht funktioniert.

Habe ihn wie folgt gesetzt:

spaceButton.setActionCommand("leer");
spaceButton.addActionListener(action);
spaceButton.setEnabled(true);
spaceButton.requestFocus();
v2Box.add(spaceButton);
 
auf setEnabled(true); kannst du verzichten, dass ist offensichtlich die Standard-Einstellung bei Buttons,

das requestFocus() kannst du erst nach setVisible(true) ausführen, funktioniert am Anfang nicht,
was nicht bedeutet, dass die setVisible(true) vorziehen sollst, erst alle Komponenten einfügen,
dann setVisible(true), dann requestFocus()
 
"requestFocus()" hat leider nicht geklappt, obwohl ich es nach "setVisible(true)" gesetzt habe.

Ich muß immer noch den Button zuerst einmal angeklickt haben, damit die Leertaste funktioniert.

Erweitern von Input und Actionmap ist ziemliches Neuland für mich.
Wie würde diese Erweiterung in meinem Programm aussehen?

Danke
 
zum einfachen (und eher bedenklichen) Weg kannst du alternativ noch
spaceButton.requestFocusInWindow();
versuchen, bei mir klappt es damit, das andere wohl nicht weil später noch sowieso ein Button den Focus bekommen muss,
der erste Button, durch requestFocusInWindow() vielleicht geändert, wer weiß schon all die Swing-Details.. 😉

Java:
public class TestGUI
    extends JFrame
{
    public TestGUI()
    {
        JPanel v2Box = new JPanel(new GridLayout(3, 1));
        JButton autoButton = new JButton("automatisch");
        autoButton.setActionCommand("auto");
        autoButton.setEnabled(true);
        v2Box.add(autoButton);

        JButton manuButton = new JButton("manuell");
        manuButton.setActionCommand("manu");
        manuButton.setEnabled(true);
        v2Box.add(manuButton);

        JButton spaceButton = new JButton("Leertaste");
        spaceButton.setActionCommand("leer");
        spaceButton.setEnabled(true);
        v2Box.add(spaceButton);

        add(v2Box);


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200, 200);
        setVisible(true);


        spaceButton.requestFocusInWindow();
    }

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

wenn auch die anderen Buttons gedrückt werden und dennoch die Leertaste weiter funktionieren soll,
wäre ständiger Focus-Wechsel oder so aber wirklich immer übler,
da musst du andere Wege gehen, zu den genannten Stichwörtern erstmal viel lernen
 
Zuletzt bearbeitet von einem Moderator:
Auch wenn der Button irgendwann mal den Focus bekommt, sobald eine andere Komponente den Focus hat klappt ein KeyListener wieder nicht.
Darum KeyBindings oder soviel ich weiß Action und Inputmap erweitern sollte auch gehen.
 
Genau darauf bezog sich meine Frage von oben: "Und... wann genau soll "requestFocus" aufgerufen werden?" - Ständig in einer schleife mit einem sleep(10) drin? :autsch: 😉
 

Zurück
Oben