2k Aufrufe
Gefragt in Anwendungen(Java,C++...) von manumanu Einsteiger_in (33 Punkte)
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:

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) {}


Vielen Dank

4 Antworten

0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Zunächst muss geklärt sein, soll die Funktion ausgeführt werden:

a) beim drücken der Leertaste, oder
b) beim klick auf den Button, welcher vorselektiert ist

Das ist nämlich ein Unterschied.

Im Fall a)  müsste nicht der Button das Event "Leertaste" behandeln, sondern ein übergeordnetes Objekt.

Im Fall b) muss der Button als "default" oder "erster Button" oder ähnlich festgelegt werden.
Es gibt bestimmt die Möglichkeit, die Fokus-Reihenfolge der Elemente festzulegen, das würde ich empfehlen, wenns geht.
Ansonsten würde ich es mit [url=http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#requestFocusInWindow%28boolean%29].requestFocusInWindow()[/url] versuchen.
0 Punkte
Beantwortet von manumanu Einsteiger_in (33 Punkte)
Die Funktion sollte auf jeden Fall beim Drücken der Leertaste ausgeführt werden. Die Ausführung der Funktion beim Drücken des Buttons wäre eher als Zusatzmöglichkeit gedacht, könnte evtl. auch komplett weggelassen werden.

Notwendig wäre, daß beim Drücken der Leertaste immer diese Funktion ausgeführt wird.

Wie würde das denn mit dem übergeordneten Objekt funktionieren?
Vielleicht ein Beispiel?


Vielen Dank
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Für ein Beispiel kenne ich mich leider nicht gut genug aus.

Wenn ich die Dokumentation richtig verstehe, gibts die Möglichkeit,
"Events" oder "Actions" zu verwenden.

Events Stichworte: KeyEvent, KeyListener

Für Events müsstest Du Dich vermutlich ausserdem mit dem Focus-system beschäftigen: FocusSpec

Ich glaube, Du wirst eher Actions wollen.
Du brauchst anscheinend die Methoden des JComponent:
getActionMap
getInputMap

siehe auch:
ActionEvent

Bei kurzer Internetrecherche nach getInputMap, getActionMap und WHEN_IN_FOCUSED_WINDOW wirst Du Beispiele finden.
0 Punkte
Beantwortet von manumanu Einsteiger_in (33 Punkte)
Danke für Deine Hilfe.
...