#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 обратно, если он никогда не терялся…