Как остановить переход фокуса на вкладку при нажатии на содержимое вкладок?

#javafx-8

#javafx-8

Вопрос:

Приведенная ниже программа показывает кнопку и ярлык на вкладке. Кнопка сфокусирована на запуске. Если щелкнуть в любом месте области содержимого, кроме кнопки, кнопка теряет фокус, а вкладка приобретает фокус.

 import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class FocusTest  extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        TabPane tabPane = new TabPane();
        tabPane.setFocusTraversable(false);
        Scene scene = new Scene(tabPane, 500, 500);
        stage.setScene(scene);
        Tab tab = new Tab("Tab 1");
        FlowPane contentPane = new FlowPane();
        /*contentPane.setOnMousePressed(MouseEvent::consume);*/
        tab.setContent(contentPane);
        tabPane.getTabs().addAll(tab, new Tab("Tab 2"));
        Button button = new Button("Button");
        Label label = new Label("Label");
        contentPane.getChildren().addAll(button, label);
        stage.show();
    }

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

Я не думаю, что кнопка должна терять фокус при нажатии в области содержимого вкладки. Я все еще хочу иметь возможность фокусировать вкладку, нажав на название вкладки / текстовый бит и используя сочетания клавиш для смены вкладки.

Я не смог найти способ сделать это с помощью вкладки или панели вкладок, но если я добавлю прослушиватель нажатия мыши на панели содержимого (см. закомментированный код выше) Я получаю требуемое поведение, но это похоже на небольшой взлом. И мне пришлось бы установить прослушиватель для каждого элемента на панели вкладок.

Итак, я полагаю, мой вопрос в том, есть ли лучший способ сделать это?


Я поднял проблему по этому поводу:

https://javafx-jira.kenai.com/browse/RT-37941

Спасибо

Ответ №1:

Вы можете запросить фокусировку на кнопке при нажатии на панель содержимого (FlowPane), вот измененная версия вашего кода:

     import javafx.application.Application;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.FlowPane;
    import javafx.stage.Stage;

    public class FocusTest  extends Application {
@Override
public void start(Stage stage) throws Exception {
    TabPane tabPane = new TabPane();
    tabPane.setFocusTraversable(false);
    Scene scene = new Scene(tabPane, 500, 500);
    stage.setScene(scene);
    final Button button = new Button("Button");// I moved this here and added final
    Tab tab = new Tab("Tab 1");
    FlowPane contentPane = new FlowPane();
    contentPane.setOnMouseClicked(new EventHandler<MouseEvent>() {//I think this is what you are looking for
        public void handle(MouseEvent event) {
            button.requestFocus();
        }
    });                          
    tab.setContent(contentPane);
    tabPane.getTabs().addAll(tab, new Tab("Tab 2"));

    Label label = new Label("Label");
    contentPane.getChildren().addAll(button, label);
    stage.show();
}

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

Если у вас есть какие-либо вопросы или вы хотели бы знать, как сделать то же самое с несколькими кнопками или другим комментарием к объекту
Я надеюсь, что это поможет вам!

Комментарии:

1. спасибо, что пытались быть полезными 🙂 Просто это не решает проблему (кнопка вообще не должна терять фокус). Регистрация MouseListener, выполняемая в коде OPs, отлично подходит для этого, нет необходимости явно запрашивать Focus обратно, если он никогда не терялся…