nai*_*jed 14 java user-interface javafx javafx-2
如何在TextArea中按Tab键导航到下一个控件?
我可以为cath de key按下事件添加一个监听器,但是如何让textArea控件失去焦点(不知道要聚焦的链中的下一个字段)?
@FXML protected void handleTabKeyTextArea(KeyEvent event) {
if (event.getCode() == KeyCode.TAB) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
小智 13
我使用遍历方法
@Override
public void handle(KeyEvent event) {
if (event.getCode().equals(KeyCode.TAB)) {
Node node = (Node) event.getSource();
if (node instanceof TextField) {
TextFieldSkin skin = (TextFieldSkin) ((TextField)node).getSkin();
if (event.isShiftDown()) {
skin.getBehavior().traversePrevious();
}
else {
skin.getBehavior().traverseNext();
}
}
else if (node instanceof TextArea) {
TextAreaSkin skin = (TextAreaSkin) ((TextArea)node).getSkin();
if (event.isShiftDown()) {
skin.getBehavior().traversePrevious();
}
else {
skin.getBehavior().traverseNext();
}
}
event.consume();
}
}
Run Code Online (Sandbox Code Playgroud)
如果按TAB键,则此代码遍历焦点,如果按CONTROL + TAB,则插入选项卡
textArea.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.TAB) {
SkinBase skin = (SkinBase) textArea.getSkin();
if (skin.getBehavior() instanceof TextAreaBehavior) {
TextAreaBehavior behavior = (TextAreaBehavior) skin.getBehavior();
if (event.isControlDown()) {
behavior.callAction("InsertTab");
} else {
behavior.callAction("TraverseNext");
}
event.consume();
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
从Java 9(2017)开始,此页面中的大多数答案都不起作用,因为您不能再这样做skin.getBehavior()
了.
这有效:
@Override
public void handle(KeyEvent event) {
KeyCode code = event.getCode();
if (code == KeyCode.TAB && !event.isShiftDown() && !event.isControlDown()) {
event.consume();
Node node = (Node) event.getSource();
try {
Robot robot = new Robot();
robot.keyPress(KeyCode.CONTROL.getCode());
robot.keyPress(KeyCode.TAB.getCode());
robot.delay(10);
robot.keyRelease(KeyCode.TAB.getCode());
robot.keyRelease(KeyCode.CONTROL.getCode());
}
catch (AWTException e) { }
}
}
Run Code Online (Sandbox Code Playgroud)
这也有效:
@Override
public void handle(KeyEvent event) {
KeyCode code = event.getCode();
if (code == KeyCode.TAB && !event.isShiftDown() && !event.isControlDown()) {
event.consume();
Node node = (Node) event.getSource();
KeyEvent newEvent
= new KeyEvent(event.getSource(),
event.getTarget(), event.getEventType(),
event.getCharacter(), event.getText(),
event.getCode(), event.isShiftDown(),
true, event.isAltDown(),
event.isMetaDown());
node.fireEvent(newEvent);
}
}
Run Code Online (Sandbox Code Playgroud)
CTRL+TAB
当用户按下时,两者都模拟按下TAB
.TextArea的默认行为CTRL+TAB
是将焦点移动到下一个控件.请注意,第二个代码基于Johan De Schutter的答案.
归档时间: |
|
查看次数: |
9354 次 |
最近记录: |