TextAreaでの集計を削除して、次のフィールドに移動します
質問
JavaFx8タブを押してTextField doのような次のフィールドに移動したときにTextAreaに集計を追加することができない方法を知りたいのです。
JavaFx2では、次のコード
でこの問題を解決します。public class TabTextAreaSkin extends TextAreaSkin implements Skin<TextArea> {
public TabTextAreaSkin(final TextArea textArea) {
super(textArea);
textArea.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observableValue, Boolean aBoolean, Boolean aBoolean2) {
if (!aBoolean2) {
textArea.deselect();
}
}
});
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.isShiftDown()) {
behavior.callAction("InsertTab");
} else {
behavior.callAction("TraverseNext");
}
event.consume();
}
}
}
});
}
.
}
しかしJavaFx8では、スキンベースにGetBehavior()メソッドはありません。だから私は何をすべきかわからない。誰かが解決策を入手しますか?
解決 2
If someone want the solution
public class TabTextArea extends TextArea {
/**
* The famous {@link org.slf4j.Logger}
*/
private static final Logger logger = LoggerFactory.getLogger(TabTextArea.class);
public TabTextArea() {
this.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.TAB) {
TextAreaSkin skin = (TextAreaSkin) getSkin();
if (skin.getBehavior() instanceof TextAreaBehavior) {
TextAreaBehavior behavior = (TextAreaBehavior) skin.getBehavior();
if (event.isControlDown()) {
behavior.callAction("InsertTab");
} else {
behavior.callAction("TraverseNext");
}
event.consume();
}
}
}
});
}
}
他のヒント
com.sun.javafx.scene.traversal.TraversalEngine
を使用してみてください。これに注意することは内部使用のみのためのものです。
final TextArea area = new TextArea();
final TraversalEngine engine = new TraversalEngine(root, false);
final KeyCombination kc = new KeyCodeCombination(KeyCode.TAB);
area.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (kc.match(event)) {
engine.trav(area, Direction.NEXT);
event.consume();
}
}
});
.
他の面倒だが安全な方法は次のとおりです。
area.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (kc.match(event)) {
int ind = vBox.getChildren().indexOf(area);
Node next = vBox.getChildren().get(ind + 1);
next.requestFocus();
event.consume();
}
}
});
. 所属していません StackOverflow