Swing F5 Taste neu laden auf ganzen Frame

Christoph74

Bekanntes Mitglied
Hallo,

ich haben einen JFrame mit mehreren (unter)components.
Innerhalb der Frame-Klasse, gibt es eine Methode zum Neu laden der gesamten Daten.

Jetzt möchte ich (ähnlich wie beim Explorer, Firefox o.ä.), dass egal welches JComponent gerade aktiv ist, beim drücken der Taste F5 diese Methode ausgeführt wird.

Wo muss ich den entsprechenden (Key)Listener hinsetzen, damit dieser immer anspricht?

Danke
Christoph
 
Da würde ich eher mit KeyBindings arbeiten. Du willst ja eine bestimmte Taste mit einer Funktion belegen. Zumal du bei einem KeyListener Probleme mit dem Fokus der Komponente kriegen könntest.
 
Du kannst KeyBindings prinzipiell an jede Komponente hängen.
Java:
public class Main {
    public static void main(String[] args) {
        final JFrame frame = new JFrame("KeyBinding Test");
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        final JPanel root = new JPanel();
        final JTextField field = new JTextField(15);
        root.add(field);
        root.add(new JTextField(15));

        root.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("ENTER"), "PRINT_AND_CLEAR_FIELD_ACTION");
        root.getActionMap().put("PRINT_AND_CLEAR_FIELD_ACTION", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Text was: " + field.getText());
                field.setText("");
            }
        });
        frame.add(root);

        frame.setVisible(true);
    }
}
 
Hallo,

Java:
[/U][/B] 
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
[B][U]

-> war der Schlüssel zum Erfolg.... funzt wunderbar ->

Danke Robat für das Beispiel -> konnte mir alles Relevante für mich daraus ziehen
Christoph
 
Du kannst KeyBindings prinzipiell an jede Komponente hängen.
Java:
public class Main {
    public static void main(String[] args) {
        final JFrame frame = new JFrame("KeyBinding Test");
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        final JPanel root = new JPanel();
        final JTextField field = new JTextField(15);
        root.add(field);
        root.add(new JTextField(15));

        root.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("ENTER"), "PRINT_AND_CLEAR_FIELD_ACTION");
        root.getActionMap().put("PRINT_AND_CLEAR_FIELD_ACTION", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Text was: " + field.getText());
                field.setText("");
            }
        });
        frame.add(root);

        frame.setVisible(true);
    }
}

Ich weiß es gehört nicht hierhin, aber kann ich dich auch kurz fragen wie man das in JavaFX macht?
 
Spontan wahrscheinlich so:
Java:
HBox root = new HBox();

TextField field = new TextField();
root.getChildren().addAll(field, new TextField());

root.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> {
    if(keyEvent.getCode() == KeyCode.ENTER) {
        System.out.println("Text was: " + field.getText());
        field.setText("");
    }
});

primaryStage.setScene(new Scene(root, 500, 500));
primaryStage.show();
 
Spontan wahrscheinlich so:
Java:
HBox root = new HBox();

TextField field = new TextField();
root.getChildren().addAll(field, new TextField());

root.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> {
    if(keyEvent.getCode() == KeyCode.ENTER) {
        System.out.println("Text was: " + field.getText());
        field.setText("");
    }
});

primaryStage.setScene(new Scene(root, 500, 500));
primaryStage.show();
Das wäre aber nicht anderes als
Code:
HBox root = new HBox();

TextField field = new TextField();
root.getChildren().addAll(field, new TextField());
// Deine Variante
root.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> {
    if(keyEvent.getCode() == KeyCode.ENTER) {
        System.out.println("Text was: " + field.getText());
        field.setText("");
    }
});
// Meine Variante
root.setOnKeyPressed(keyEvent -> {
    if(keyEvent.getCode() == KeyCode.ENTER) {
        System.out.println("Text was: " + field.getText());
        field.setText("");
    }
});

primaryStage.setScene(new Scene(root, 500, 500));
primaryStage.show();

Es geht mir gerade darum dass ich eine Anwendung habe, die über Escape die aktuelle Panel im StackPane toBack() aufruft. Das Problem ist nur wenn ich die Stage im Fullscreen habe, dann gibts es Komplikation mit Orginalzustand der Stage und toBack() der aktuellen Panels.

Wie kann man sowas umgehen?
 
Vielleicht solltest du dir anschauen, wie das Event-Filtering und Event-Handling funktioniert (etwas, was ich übrigens auch immer wieder mal durcheinander bringe und daher ab und an wieder nachlesen muss):

https://stackoverflow.com/questions...fference-between-eventhandler-and-eventfilter
Whenever an event happens, it follows a process to determine which node in the scene graph should handle the event. The process takes these steps:

  • Target selection
  • Route construction
  • Event capturing <- filters are triggered here
  • Event bubbling <- handlers are triggered here
Target Selection Say that your scene contains a pane with a circle. If you click on the circle, the circle becomes the event target.

Route Construction Next, JavaFX creates a route (or an event dispatch chain). In our example the chain would look like stage -> scene -> pane -> circle

Event Capturing The event gets carried through every event filter on the chain. As soon as one of the filters calls consume(), the chain stops and that node becomes the target. If no filter calls consume() the end of the chain (the circle) remains the target.

Event Bubbling Next, the event get pushed through the chain again, but this time from the event target to the stage. So if the pane event filter called consume(), the following event handlers will be hit: pane -> scene -> stage

So the difference is not only when these handlers get activated, but also that event filters can prevent child nodes from receiving events.
 

Neue Themen


Zurück
Oben