【问题标题】:How can I de-select/ Unfocus everything when presing ESC按下 ESC 时如何选择/取消焦点
【发布时间】:2019-01-23 20:00:31
【问题描述】:

我有以下迷你应用:

public class TestApp extends Application {

    public static void main(final String[] args) {
    launch(args);
    }

    private final AtomicLong counter = new AtomicLong();

    @Override
    public void start(final Stage primaryStage) {

    final VBox root = new VBox(5);
    root.setPadding(new Insets(10));
    root.setAlignment(Pos.CENTER);

    final TableView<String> tableView = new TableView<>();
    final TableColumn<String, String> column = new TableColumn<>("Text");
    column.setCellValueFactory(f -> new SimpleStringProperty(f.getValue()));

    tableView.getColumns().add(column);

    // Add some sample items to our TableView
    for (int i = 0; i < 100; i++) {
        tableView.getItems().add("Item #" + counter.incrementAndGet());
    }

    final Button button = new Button("Add items");

    final TextArea t1 = new TextArea();

    button.setOnAction(e -> {
        final long oldElement = counter.get();
        // Add more elements
        for (int i = 0; i < 10; i++) {
        tableView.getItems().add("Item #" + counter.incrementAndGet());
        }
        tableView.scrollTo("Item #" + oldElement);
    });

    root.getChildren().add(button);
    root.getChildren().add(t1);
    root.getChildren().add(tableView);

    // Show the Stage
    primaryStage.setWidth(300);
    primaryStage.setHeight(300);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
    }
}

当它启动时,按钮具有焦点。如果我在 TextArea 中单击,它将获得焦点。

除了按下按钮之外,现在没有办法再次“取消聚焦”TextArea(这将触发一个动作,如果我只想摆脱焦点,这是不需要的)。

如何释放所有焦点并取消选择所有内容,例如当我按下 ESC 时?

【问题讨论】:

标签: javafx


【解决方案1】:

我不知道这是否完全符合你的要求,但你可以创建一个boolean 变量来跟上ESCAPE 的状态。您还可以使用ChangeListener,它允许根节点在失去焦点时重新获得焦点。

import java.util.concurrent.atomic.AtomicLong;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TestApp extends Application
{

    boolean escActive = false;

    final VBox root = new VBox(5);

    ChangeListener<Boolean> changeListener1 = new ChangeListener()
    {
        @Override
        public void changed(ObservableValue observable, Object oldValue, Object newValue)
        {
            System.out.println(newValue);
            root.requestFocus();
        }
    };

    public static void main(final String[] args)
    {
        launch(args);
    }

    private final AtomicLong counter = new AtomicLong();

    @Override
    public void start(final Stage primaryStage)
    {

        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        final TableView<String> tableView = new TableView<>();
        final TableColumn<String, String> column = new TableColumn<>("Text");
        column.setCellValueFactory(f -> new SimpleStringProperty(f.getValue()));

        tableView.getColumns().add(column);

        // Add some sample items to our TableView
        for (int i = 0; i < 100; i++) {
            tableView.getItems().add("Item #" + counter.incrementAndGet());
        }

        final Button button = new Button("Add items");

        final TextArea t1 = new TextArea();

        button.setOnAction(e -> {
            if (!escActive) {
                final long oldElement = counter.get();
                // Add more elements
                for (int i = 0; i < 10; i++) {
                    tableView.getItems().add("Item #" + counter.incrementAndGet());
                }
                tableView.scrollTo("Item #" + oldElement);
            }
        });

        root.getChildren().add(button);
        root.getChildren().add(t1);
        root.getChildren().add(tableView);

        root.setOnKeyReleased((event) -> {
            System.out.println(event.getCode());
            if (event.getCode() == KeyCode.ESCAPE) {
                escActive = !escActive;
                if (escActive) {
                    root.requestFocus();
                    root.focusedProperty().addListener(changeListener1);
                }
                else {
                    root.focusedProperty().removeListener(changeListener1);
                }
            }
        });

        // Show the Stage
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2020-05-21
    • 2015-05-30
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多