JavaFx自定义Tab-Order
title: JavaFx自定义Tab-Order
Tab-order是什么?在界面上当你按tab键触发焦点转移的功能,这就是tab order。但是Javafx有个缺陷就是不方便自己设置tab-order的顺序。
15年JDK爆出这个bug,有人提过:
最后JDK中迫不得已临时把Parent类中的私有方法setImpl_traversalEngine设置为了public,让用户可以设置Node自己的tab-order顺序。
相关解决方案 stackoverflow
示例:
- fxml文件
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<?import java.net.URL?>
<BorderPane fx:id="root" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.cmlanche.easymvvmfx.ui.login.LoginView">
<center>
<Label style="-fx-font-size: 32" text="hello world"/>
</center>
<bottom>
<VBox fx:id="testbox">
<Button fx:id="btn" text="tray">
</Button>
<TextField fx:id="t1"/>
<TextField fx:id="t2"/>
<TextField fx:id="t3"/>
</VBox>
</bottom>
</BorderPane>
- Controller文件
package com.cmlanche.easymvvmfx.ui.login;
import com.fx.base.mvvm.BaseView;
import com.sun.javafx.scene.traversal.Algorithm;
import com.sun.javafx.scene.traversal.Direction;
import com.sun.javafx.scene.traversal.ParentTraversalEngine;
import com.sun.javafx.scene.traversal.TraversalContext;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import tray.notification.NotificationType;
import tray.notification.TrayNotification;
/**
* Created by cmlanche on 2016/12/9.
*/
public class LoginView extends BaseView<LoginViewModel> {
@FXML
Button btn;
@FXML
TextField t1;
@FXML
TextField t2;
@FXML
TextField t3;
@FXML
VBox testbox;
@Override
protected void onViewCreated() {
t2.setFocusTraversable(true);
t2.requestFocus();
testbox.setImpl_traversalEngine(new ParentTraversalEngine(testbox, new Algorithm() {
@Override
public Node select(Node owner, Direction dir, TraversalContext context) {
if ("t2".equals(owner.getId())) {
return t3;
} else if ("t3".equals(owner.getId())) {
return t1;
} else if ("t1".equals(owner.getId())) {
return btn;
} else {
return t2;
}
}
@Override
public Node selectFirst(TraversalContext context) {
return t2;
}
@Override
public Node selectLast(TraversalContext context) {
return t1;
}
}));
}
}
原来的tab-order顺序是btn->t1->t2->t3,现在的顺序是t2->t3->t1->btn。

需要注意的是
setImpl_traversalEngine是deprecated方法,以后可能废弃的apiLoginView是我的框架easyMvvmFx构建的控制器,不能直接放在你代码中运行。
欢迎加我的qq群探讨JavaFx 最大最活跃的JavaFx社群 518914410
JavaFx自定义Tab-Order的更多相关文章
- 孙鑫视频学习:VS2010中找不到【Tab order】菜单项
在学习孙鑫视频中,修改Tab顺序时,找不到VC6.0中提到的[Layout]->[Tab order]菜单项,但VC2010中可以用Ctrl+D调出来Tab顺序,或者[格式]->[Tab键 ...
- Android: 自定义Tab样式,一种简单的方式。
之前看到过论坛里已经有人发过自定义Tab样式的帖子,感觉有些复杂了,这里分享个简单的方法. 1.制作4个9patch的tab样式,可参考android默认的资源 tab_unselected.9.pn ...
- vs 2015工具栏添加Tab Order
1. 在工具栏右键,弹出菜单,选中“Customize”菜单项. 2. 选中Commands标签页,选择Toolbar,选择自己要加入的Tab order的类别,之后点击“Add Command”按钮 ...
- 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment
仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...
- ionic ion-tab图标修改, 自定义tab图标
遇到需要自定义tab图标很简单, 只需要自定义相应的css就可以了, 这里要注意的是如何调整背景图片的大小. <ion-view hide-back-button="false&quo ...
- TabLayout自定义tab,实现多样导航栏
代码地址如下:http://www.demodashi.com/demo/14660.html 前言 之前有讲过TabLayout的一些知识, TabLayout实现顶部导航(一) TabLayout ...
- [网页游戏开发]容器的使用及自定义Tab,RadioGroup,List,ViewStack
Morn里面,容器和其他普通组件不同,无需皮肤,所以也不能从组件树种拖动创建(Tab,RadioGroup例外),只能转换而来 Morn的容器组件主要有Box,Container,Panel,Tab, ...
- 自定义SWT控件六之自定义Tab
6.自定义tab 本章节提供的自定义tab 分为两类 tab上带删除按钮和添加按钮,可删除tab和添加tab tab不可删除和添加 6.1 不可删除tab package com.view.contr ...
- Vue可自定义tab组件
在工作中我们常常要用到tab组件,如果有用第三方组件库的话一般都会有这个组件,但如果没有使用第三方组件库,或者想要自定义tab,那么或许这个无依赖的tab组件将会极大地节约你的开发时间. 如何 ...
随机推荐
- javaScript绑定事件委托 demo
事件绑定通常发生在 onload 或 DOMContentReady , 事件绑定占用 处理时间 占用内存, 而且不是每个事件都会被 点击执行. 由此 事件委托 可以优化事件绑定行为.. 事件逐层冒泡 ...
- Android 使用纯Java代码布局
java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...
- UT源码-124
(1)设计三角形问题的程序 输入三个整数a.b.c,分别作为三角形的三条边,现通过程序判断由三条边构成的三角形的类型为等边三角形.等腰三角形.一般三角形(特殊的还有直角三角形),以及不构成三角形.(等 ...
- vue组件递归
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ASP.NET Core MVC 源码学习:详解 Action 的激活
前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...
- 【2017-03-30】JS-document对象
一.获取标记对象 1.document.getElementById("id"); 根据id找,最多找到一个. 2.document.getElementsByNa ...
- 华为C语言编程规范笔记1
入职之前,公司培训,做了点笔记~
- dotnet Core 调用HTTP接口,系统大量CLOSE_WAIT连接问题的分析,尚未解决。
环境: dotnet core 1.0.1 CentOS 7.2 今天在服务器巡检的时候,发现一个服务大量抛出异常 异常信息为: LockStatusPushError&&Messag ...
- git常见操作和常见错误
最近写了个博客demo,在上传至github时,居然报错了,刚开始学习代码上传,免不了遇到一些问题,报错信息如下: fatal: remote origin already exists. (致命错误 ...
- Redis基础学习(四)—Redis的持久化
一.概述 Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方 ...