是否可以更改JavaFX TextArea
的默认行为,以便按下Tab
将焦点传递给下一个组件?JavaFX 8 TextArea松散焦点在标签
2
A
回答
5
虽然@ItachiUchiha解决方案工作,他指出,这取决于在布局(box
他样品)。
根据此question,无论布局如何,都可以修改TextArea
的默认行为。
但是,您需要使用这个私有API,这可能会随时更改,恕不另行通知。
在此示例中,Tab
和Shitf+Tab
将具有所需行为,而Ctrl+Tab
将在文本区域插入"\t"
。
@Override
public void start(Stage primaryStage) {
TextArea area = new TextArea();
area.addEventFilter(KeyEvent.KEY_PRESSED, (KeyEvent event) -> {
if (event.getCode() == KeyCode.TAB) {
TextAreaSkin skin = (TextAreaSkin) area.getSkin();
if (skin.getBehavior() instanceof TextAreaBehavior) {
TextAreaBehavior behavior = (TextAreaBehavior) skin.getBehavior();
if (event.isControlDown()) {
behavior.callAction("InsertTab");
} else if (event.isShiftDown()) {
behavior.callAction("TraversePrevious");
} else {
behavior.callAction("TraverseNext");
}
event.consume();
}
}
});
VBox root = new VBox(20, new Button("Button 1"), area, new Button("Button 2"));
Scene scene = new Scene(root, 400, 300);
primaryStage.setScene(scene);
primaryStage.show();
}
+0
不中的Java 9工作(2017),因为你不能'skin.getBehavior()'。 – MarcG 2017-12-05 04:31:11
1
那么,你绝对可以做到这一点,但它取决于TextArea添加到的布局。我创建了一个简单的示例,其中一个TextArea
和一个TextField
都被添加到VBox
。有一个keyEventHandler
它会监视TextArea
的keyPress
事件并发送focus
下一个孩子(如果有的话)
import java.util.Iterator;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TextAreaTabFocus extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
VBox box = new VBox();
TextArea textArea = new TextArea();
TextField textField = new TextField();
box.getChildren().addAll(textArea, textField);
final EventHandler<KeyEvent> keyEventHandler =
keyEvent -> {
if (keyEvent.getCode() == KeyCode.TAB) {
Iterator<Node> itr = box.getChildren().iterator();
while(itr.hasNext()) {
if(itr.next() == keyEvent.getSource()) {
if(itr.hasNext()){
itr.next().requestFocus();
}
//If TextArea is the last child
else {
box.getChildren().get(0).requestFocus();
}
break;
}
}
keyEvent.consume();
}
};
textArea.setOnKeyPressed(keyEventHandler);
Scene scene = new Scene(box, 200, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
相关问题
- 1. JavaFX HTMLEditor - 焦点webView(TextArea)
- 2. TextChange事件在asp.net中松散焦点
- 3. contenteditable松散焦点,但仍然写
- 4. jQuery Textarea焦点
- 5. 将标签添加到Textarea后保持焦点
- 6. textarea焦点问题
- 7. 选定项目后永久导航视图松散焦点
- 8. 如何强制JavaFX组合框放松焦点?
- 9. KeyEvents和焦点JavaFX
- 10. KeyEvent焦点JavaFX FXML
- 11. javafx焦点窗口
- 12. 的Delphi XE 7的TListBox主要形式松散焦点draganddrop
- 13. QT标签控件 - 焦点
- 14. 焦点与JS的标签
- 15. FB4 TextArea焦点皮肤
- 16. z标签散点图
- 17. ggplot2散点图标签
- 18. 点击textarea隐藏标签值
- 19. 将文本附加到TextArea(JavaFX 8)
- 20. JavaFX中的textarea的透明背景8
- 21. 从TextField删除焦点JavaFX
- 22. 散点图标签在一行中 - Matplotlib
- 23. as3 textarea焦点事件bug
- 24. 焦点和不重点标签移动
- 25. 重点标签焦点不工作
- 26. 标签在IE jQuery UI的标签失去焦点
- 27. CCMenuItems宽松标签
- 28. 焦点不能在textarea上工作
- 29. HTMLEditor将焦点放在textarea里面
- 30. 焦点textarea在iOS上与angularjs
[JavaFX的文本区Tab键导航]的可能的复制(https://stackoverflow.com/questions/12860478/tab-key-navigation-in-javafx-textarea) – MarcG 2017-12-05 04:29:16