- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要在 Ctrl-Tab 和 Ctrl-Shift-Tab 上切换标签。但它仅在 TabPane 处于焦点上 时才有效。我有带有 setContent(textArea) 的选项卡。当 textArea 处于焦点状态时,我按下 Ctrl-Tab,焦点转到菜单中的某处:
TextArea@3f40a15a[styleClass=text-input text-area]
TextArea@7b7c82a4[styleClass=text-input text-area]
TabPane[id=null, styleClass=tab-pane]
TextArea[id=null, styleClass=text-input text-area]
MenuButtonSkinBase$MenuLabeledImpl[id=null, styleClass=label]
TextArea[id=null, styleClass=text-input text-area]
MenuButtonSkinBase$MenuLabeledImpl[id=null, styleClass=label]
TextArea[id=null, styleClass=text-input text-area]
TabPane[id=null, styleClass=tab-pane]
TextArea[id=null, styleClass=text-input text-area]
MenuButtonSkinBase$MenuLabeledImpl[id=null, styleClass=label]
TextArea[id=null, styleClass=text-input text-area]
我像这样跟踪焦点变化:
scene.focusOwnerProperty().addListener(new ChangeListener<Node>() {
@Override
public void changed(ObservableValue<? extends Node> ov, Node t, Node t1) {
System.out.println(t1);
}
});
我几乎在每个组件(包括菜单、工具栏、文本区域和 Pane )上都将 setFocusTraversable 设置为 false
我创建了标签并使用了 setContent(textArea)。
此外,每次用户打开/关闭选项卡并在选项卡之间切换(使用鼠标和键盘热键)时,我都想在 textArea 上requestFocus。
tabPane.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (tabPane.getTabs().size() > 0) {
FileTab tab = (FileTab)tabPane.getTabs().get(tabPane.getSelectionModel().getSelectedIndex());
tab.getTextArea().requestFocus();
}
}
});
}
});
这是行不通的。我尝试了 tab.getContent().requestFocus() - 也不起作用。
关于在 TabPane 子项处于焦点时更改选项卡:看起来TabPane 得到了KeyEvent,但是因为它不在focus(textArea in focus),所以它只是跳过了这个事件。也许我可以通过在 TabPane 触发 KeyEvent 来复制默认功能,或者甚至可以自己重新实现它。或者我可以从这个监听器调用 nextTab/previousTab 默认操作:
tabPane.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler() {
@Override
public void handle(KeyEvent t) {
if (t.getCode().equals(KeyCode.TAB) && t.isControlDown()) {
//Event.fireEvent(tabPane, event); //I'm not sure how to do it like this
//Maybe it's better to just call default actions on TabPane.
t.consume();
}
}
});
http://s23.postimg.org/poeujzwbf/screenshot_185.png
但我仍然不知道如何在标签切换后将焦点设置在 TextArea 上。也许我应该在延迟一段时间后尝试调用 Platform.runLater()?
最佳答案
标签切换的解决方案:
scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
if (t.getCode().equals(KeyCode.TAB) && t.isControlDown()) {
int size = tabPane.getTabs().size();
if (size > 0) {
SkinBase skin = (SkinBase) tabPane.getSkin();
TabPaneBehavior tabPaneBehavior = (TabPaneBehavior) skin.getBehavior();
int selectedIndex = tabPane.getSelectionModel().getSelectedIndex();
if (!t.isShiftDown()) {
if (selectedIndex < size -1) {
tabPaneBehavior.selectNextTab();
} else {
tabPaneBehavior.selectTab(tabPane.getTabs().get(0));
}
} else {
if (selectedIndex > 0) {
tabPaneBehavior.selectPreviousTab();
} else {
tabPaneBehavior.selectTab(tabPane.getTabs().get(size - 1));
}
}
t.consume();
}
}
}
});
在选定选项卡上设置焦点的解决方案:
tabPane.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, final Number t1) {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (tabPane.getTabs().size() > 0) {
final FileTab tab = (FileTab) tabPane.getTabs().get(t1.intValue());
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Platform.runLater(new Runnable() {
@Override
public void run() {
tab.getContent().requestFocus();
timer.cancel();
timer.purge();
}
});
}
}, 25);
}
}
});
}
});
在选定选项卡上设置焦点的替代解决方案(基于@Uluk Biy 的 https://stackoverflow.com/a/16920898):
tabPane.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, final Number t1) {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (tabPane.getTabs().size() > 0) {
final FileTab tab = (FileTab) tabPane.getTabs().get(t1.intValue());
final Timeline animation = new Timeline(
new KeyFrame(Duration.millis(25),
new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
Platform.runLater(new Runnable() {
@Override
public void run() {
tab.getContent().requestFocus();
}
});
}
}));
animation.setCycleCount(1);
animation.play();
}
}
});
}
});
这应该是比仅使用计时器更好的解决方案。
关于JavaFX TabPane 仅在获得焦点时切换选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19025268/
我遇到了一个非常奇怪的问题,即 TabPane 的选项卡按钮位于左侧。该问题仅在应用程序运行时出现,但在 SceneBuilder (2.0) 预览中不存在。 每次选定的 Tab 更改(通过用户单击或
我有一个带有可变复选框列表的阶段。当列表更改时,舞台必须调整大小。这在大多数情况下都可以正常工作,在将所有复选框添加到 VBox 之后,您然后调用 stage.sizeToScene() 并且舞台相应
如果您在没有足够空间显示所有选项卡时尝试对选项卡进行排序,JavaFX TabPane 会出现非常奇怪的行为。 更准确地说,应该显示包含所有选项卡的下拉列表的选项卡选择按钮(选项卡 Pane 标题右侧
使用 JavaFX 2.2 我有一个窗口,它主要由一个带有 4 个选项卡的 TabPane 组成。用户可能会更改任何选项卡中显示的数据,如果他们这样做,我想确保他们在保存/取消/更新数据之前不会离开该
下面是我的带有 TabPane 的 GridPane 代码。 TabPane 中有 2 个选项卡。 当我在 SceneBuilder 上单击预览时,选项卡不会在单击选项卡头时切换。
我有一个包含一些内容的 Tab:ScrollBar 和其他内容。 ScrollBar 具有键的事件处理程序:left 和 right。 但是如果我按下这些按钮,Tabs 就会切换,因为 TabPane
我需要在 Ctrl-Tab 和 Ctrl-Shift-Tab 上切换标签。但它仅在 TabPane 处于焦点上 时才有效。我有带有 setContent(textArea) 的选项卡。当 textAr
我注意到,在 TabPane 中添加和删除选项卡时,它无法匹配基础列表中选项卡顺序的位置。仅当至少一个选项卡因父项的宽度而完全隐藏时才会发生这种情况。下面是一些复制问题的代码: public clas
当我在选项卡 Pane 中添加一行时,该行的内容似乎具有跨选项卡 Pane 边缘边界的负边距。 如何在选项卡 Pane 中添加行(和列)? 下面是我的 HTML: Profil/Virksomhed
我正在尝试使用 fxml 添加一个新选项卡。 我已经在 tabPane 中添加了标签。 int numTabs = tabPane.getTabs().size(); Tab tab = new Ta
我在 ScrollPane 内的 Tabpane 内有一个 BorderPane。如果我删除 TabPane 并将 BorderPane 作为 ScrollPane 的内容,ScrollPane.Sc
我想要一个包含多个选项卡的 TabPane,每个选项卡都有不同的上下文菜单。 在 TabPane 上设置 ContextMenu 显然会导致使用相同的 ContextMenu,无论选择哪个选项卡。我尝
我有一个 javafx 应用程序,可以在滚动 Pane 中显示内容。此内容包括一个 TabPane。在选项卡内,有一个 VBox,其中包含可以根据用户交互更改高度的小部件,特别是: 显示更多行的表格
在我的 JavaFX 应用程序中,我有一个 TabPane在 TitledPane 。 TabPane内是 VBox其中包括一个按钮,可增加 VBox 中的元素数量(因此, VBox 的高度)。 但是
我的 TabPane 似乎只水平填充它的宽度,而不是垂直填充。我现在的解决方法是这样做: stage.getScene().heightProperty().addListener(new C
在我的 GUI 中,我尝试显示一个包含其他元素的 TabPane。 当调用特定场景的初始化方法时,我可以将所需的数据添加到第一个Tab中。 如何访问第二个并在那里添加数据?` 当您在单个选项卡之间切换
我有一个网络工具,用户可以在其中动态创建和删除多个选项卡式对象(可能很多),我正在使用 Google Closure TabPane 并且一切正常,除了事实是每次创建 TabPane 实例都会添加以下
JavaFX 8 中是否有一种方法可以将按钮放入 TabPane 中,如下面的模型所示?如果可能的话,我只想使用 FXML 文件。 最佳答案 看完“Add Buttons to Tabs and Ta
我在 JavaFX TabPane 中发现了一个小错误,正在寻找解决方法。我正在运行 JavaFX 13.0.1。 它是如何发生的: TabPane 的 DragPolicy 必须设置为 TabPan
你好,我如何在JavaFX中添加一个窗口,当我将它作为选项卡拖到选项卡上并再次双击以再次将其释放为窗口时? 例如 Firefox 或 Chrome 中的选项卡。双击以获取一个新窗口,然后将其拖到上方以
我是一名优秀的程序员,十分优秀!