質問

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();
        }
    }
});
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top