javafx virtual keyboard
2024-08-31 08:08:11
public class EffectTest extends Application {
@Override
public void start(final Stage stage) {
final Keyboard keyboard = new Keyboard(
new Key(KeyCode.W),
new Key(KeyCode.S),
new Key(KeyCode.A),
new Key(KeyCode.D)
); final Scene scene = new Scene(new Group(keyboard.createNode()));
stage.setScene(scene);
stage.setTitle("Keyboard Example");
stage.show();
} private static final class Key {
private final KeyCode keyCode;
private final BooleanProperty pressedProperty; public Key(final KeyCode keyCode) {
this.keyCode = keyCode;
this.pressedProperty = new SimpleBooleanProperty(this, "pressed");
} public KeyCode getKeyCode() {
return keyCode;
} public boolean isPressed() {
return pressedProperty.get();
} public void setPressed(final boolean value) {
pressedProperty.set(value);
} public Node createNode() {
final StackPane keyNode = new StackPane();
keyNode.setFocusTraversable(true);
installEventHandler(keyNode); final Rectangle keyBackground = new Rectangle(, );
keyBackground.fillProperty().bind(
Bindings.when(pressedProperty)
.then(Color.RED)
.otherwise(Bindings.when(keyNode.focusedProperty())
.then(Color.LIGHTGRAY)
.otherwise(Color.WHITE)));
keyBackground.setStroke(Color.BLACK);
keyBackground.setStrokeWidth();
keyBackground.setArcWidth();
keyBackground.setArcHeight(); final Text keyLabel = new Text(keyCode.getName());
keyLabel.setFont(Font.font("Arial", FontWeight.BOLD, )); keyNode.getChildren().addAll(keyBackground, keyLabel); return keyNode;
} private void installEventHandler(final Node keyNode) {
// handler for enter key press / release events, other keys are
// handled by the parent (keyboard) node handler
final EventHandler<KeyEvent> keyEventHandler =
new EventHandler<KeyEvent>() {
public void handle(final KeyEvent keyEvent) {
if (keyEvent.getCode() == KeyCode.ENTER) {
setPressed(keyEvent.getEventType()
== KeyEvent.KEY_PRESSED); keyEvent.consume();
}
}
}; keyNode.setOnKeyPressed(keyEventHandler);
keyNode.setOnKeyReleased(keyEventHandler);
}
} private static final class Keyboard {
private final Key[] keys; public Keyboard(final Key... keys) {
this.keys = keys.clone();
} public Node createNode() {
final HBox keyboardNode = new HBox();
keyboardNode.setPadding(new Insets()); final List<Node> keyboardNodeChildren = keyboardNode.getChildren();
for (final Key key: keys) {
keyboardNodeChildren.add(key.createNode());
} installEventHandler(keyboardNode);
return keyboardNode;
} private void installEventHandler(final Parent keyboardNode) {
// handler for key pressed / released events not handled by
// key nodes
final EventHandler<KeyEvent> keyEventHandler =
new EventHandler<KeyEvent>() {
public void handle(final KeyEvent keyEvent) {
final Key key = lookupKey(keyEvent.getCode());
if (key != null) {
key.setPressed(keyEvent.getEventType()
== KeyEvent.KEY_PRESSED); keyEvent.consume();
}
}
}; keyboardNode.setOnKeyPressed(keyEventHandler);
keyboardNode.setOnKeyReleased(keyEventHandler); keyboardNode.addEventHandler(KeyEvent.KEY_PRESSED,
new EventHandler<KeyEvent>() {
public void handle(
final KeyEvent keyEvent) {
handleFocusTraversal(
keyboardNode,
keyEvent);
}
});
} private Key lookupKey(final KeyCode keyCode) {
for (final Key key: keys) {
if (key.getKeyCode() == keyCode) {
return key;
}
}
return null;
} private static void handleFocusTraversal(final Parent traversalGroup,
final KeyEvent keyEvent) {
final Node nextFocusedNode;
switch (keyEvent.getCode()) {
case LEFT:
nextFocusedNode =
getPreviousNode(traversalGroup,
(Node) keyEvent.getTarget());
keyEvent.consume();
break; case RIGHT:
nextFocusedNode =
getNextNode(traversalGroup,
(Node) keyEvent.getTarget());
keyEvent.consume();
break; default:
return;
} if (nextFocusedNode != null) {
nextFocusedNode.requestFocus();
}
} private static Node getNextNode(final Parent parent,
final Node node) {
final Iterator<Node> childIterator =
parent.getChildrenUnmodifiable().iterator(); while (childIterator.hasNext()) {
if (childIterator.next() == node) {
return childIterator.hasNext() ? childIterator.next()
: null;
}
} return null;
} private static Node getPreviousNode(final Parent parent,
final Node node) {
final Iterator<Node> childIterator =
parent.getChildrenUnmodifiable().iterator();
Node lastNode = null; while (childIterator.hasNext()) {
final Node currentNode = childIterator.next();
if (currentNode == node) {
return lastNode;
} lastNode = currentNode;
} return null;
}
} }
//
最新文章
- javascript动画系列第一篇——模拟拖拽
- Log4Net 配置SQL2008数据库 并传入自定义业务对象
- oracle之sqlplus讲解
- IRedisClient 常用方法说明
- xcode plugin
- jquery基础篇
- Objective-C中的占位符,打印BOOL类型数据
- Cocos2d-x java 通过jni调用c++的方法
- 去掉搜狗拼音烦人的x+;进入搜狗搜索
- C#操作Cookie
- WPF界面设计技巧(8)—自制山寨版CheckListBox
- Java 伙伴系统(模拟)
- spring-cloud-sleuth+zipkin源码探究
- Pig latin基础
- iOS 静态库和动态库(库详解)
- 09: TemplateView , ListView ,DetailView三种常用类视图用法
- SVN自动更新-win平台
- PYQT窗口居中
- Python 绘图库的使用:matplotlib
- Hints of sd0061(快排思想)
热门文章
- MySql语句中select可以嵌套么,字段的重命名可以用中文么
- PostgreSQL中流复制pg_basebackup做了什么
- UI体系的本质是结构化存在
- jQuery的一些选择器
- 洛谷P2197 nim游戏模板
- vue项目的环境变量
- WHU 1538 Stones II 动态规划
- [Recompose] Merge RxJS Button Event Streams to Build a React Counter Component
- swift学习之数组
- C. Diverse Permutation(Codeforces Round #275(div2)