我试图在一段时间后以编程方式关闭子窗口。此子窗口initOwner设置有主阶段。但是在关闭此子窗口时,主窗口将变得集中。有什么办法(以编程方式)关闭子窗口而不关注主窗口吗?
以下是我的问题的快速演示。我尝试了所有可能的方式来关闭窗口。重现步骤:
启动应用程序后,单击按钮以打开子窗口。此子窗口将在10秒后自动关闭。
同时打开任何其他应用程序(记事本,Outlook,浏览器..或其他)。在处理该应用程序时,当关闭子窗口时,主阶段将获得焦点并位于当前应用程序的前面。这对我的客户来说很烦。
注意:我无法删除initOwner(),因为我一直希望将子窗口保持在主窗口顶部。
更新:根据评论,我尝试在Windows 10中使用不同的jdk版本(u91,u121和u211)运行该演示。在所有这三种情况下,关闭子窗口的那一刻,主要阶段就来到了前面。我什至在不同的系统上尝试过,但结果是相同的:(
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.util.Duration;
public class OwnerStage_Demo extends Application {
@Override
public void start(Stage stage) throws Exception {
Button button = new Button("Open Window");
button.setOnAction(e -> {
Stage stg = new Stage();
stg.setScene(new Scene(new StackPane(), 300, 300));
stg.initOwner(stage);
stg.show();
// Window will close automatically after 10secs.
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(10000), x -> {
//stg.close(); …Run Code Online (Sandbox Code Playgroud) setOrientation设置为时Orientation.HORIZONTAL滑块的运动非常平滑,但setOrientation设置为时Orientation.VERTICAL运动则比较滞后。
以下是最小再现:
package org.example;
import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.controlsfx.control.RangeSlider;
public class App extends Application {
@Override
public void start(Stage stage) {
RangeSlider rangeSliderVertical = new RangeSlider();
rangeSliderVertical.setOrientation(Orientation.VERTICAL);
rangeSliderVertical.setMinHeight(500);
rangeSliderVertical.setMax(100);
rangeSliderVertical.setMin(0);
rangeSliderVertical.setHighValue(100);
rangeSliderVertical.setLowValue(0);
RangeSlider rangeSliderHorizontal = new RangeSlider();
rangeSliderHorizontal.setMinWidth(500);
rangeSliderHorizontal.setMax(100);
rangeSliderHorizontal.setMin(0);
rangeSliderHorizontal.setHighValue(100);
rangeSliderHorizontal.setLowValue(0);
rangeSliderHorizontal.setOrientation(Orientation.HORIZONTAL);
FlowPane vBoxWithSliders = new FlowPane();
VBox.setVgrow(vBoxWithSliders, Priority.ALWAYS);
HBox.setHgrow(vBoxWithSliders, Priority.ALWAYS);
vBoxWithSliders.setAlignment(Pos.CENTER);
vBoxWithSliders.getChildren().addAll(rangeSliderVertical, rangeSliderHorizontal);
var scene = …Run Code Online (Sandbox Code Playgroud) 有什么方法可以管理多个阶段的z索引顺序(彼此独立)。例如,存在三个阶段A,B和C。StageA应该始终保持落后。StageB应该在中间,而StageC应该总是在最上面。请特别注意,这三个阶段彼此之间没有关系(例如所有者)
以下是我所期望的快速演示。我需要访问任何阶段(用于拖动或修改),但需要保持z顺序。任何想法或帮助都将受到高度赞赏。
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.util.HashMap;
import java.util.Map;
public class StagesZOrdering_Demo extends Application {
private Map<String, Stage> stages = new HashMap<>();
@Override
public void start(Stage stage) throws Exception {
Button button1 = new Button("Back");
button1.setOnAction(e -> openStage("Back"));
Button button2 = new Button("Middle");
button2.setOnAction(e -> openStage("Middle"));
Button button3 = new Button("Front");
button3.setOnAction(e -> openStage("Front"));
VBox root = new VBox(button1, button2, button3);
root.setAlignment(Pos.CENTER);
root.setSpacing(10);
Scene sc = new …Run Code Online (Sandbox Code Playgroud) 最近,我将应用程序从 JavaFX 8 更新到 JavaFX 18。迁移后,我发现了一些与TreeView. 如果我理解正确的话,在场景脉冲结束时,所有节点(实际上是父节点)都将完全渲染,并且变为isNeedsLayoutfalse,直到发生下一次更改。
这在 JavaFX 8 中按预期工作。而在 JavaFX 18 中,对于某些节点,即使在脉冲完成后isNeedsLayout标志仍然存在。true这是一个错误吗?还是故意这么实施的?
在下面的演示中,我尝试TreeView在脉冲完成后打印所有节点( 的子节点)状态。我可以清楚地看到两个 JavaFX 版本之间的输出差异。
谁能告诉我,如何确保所有节点都正确渲染/布局。
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class TreeViewLayoutIssue extends Application {
int k = 1;
@Override
public void start(Stage primaryStage) throws Exception …Run Code Online (Sandbox Code Playgroud) 升级到最新的 JavaFX 版本 (19) 后,我遇到了一些奇怪的问题。
如果我将最后一个选项设置为 ComboBox 中的值,那么在第一次打开时,如果我选择任何选项,下拉列表将不会隐藏。之后,下拉菜单将像往常一样工作。奇怪的是,只有当我将最后一个选项设置为值时才会发生这种情况。当我设置除最后一个选项之外的任何其他选项时,它运行良好。
在上面的示例中,您可以注意到:
当我试图调查根本原因时,我几乎得出结论,这是因为新功能“focusWithIn”。因为这就是导致问题发生的地方。
但经过进一步调查,我还注意到焦点被搞乱了。在上面的 gif 中,您还可以注意到,如果我将最后一个选项设置为值,则“聚焦”样式不会应用于 ComboBox(同样只是第一次,直到我将焦点移到另一个节点,当我回来时,它会照常工作) )。而如果我设置不同的值,则聚焦样式效果会很好。
当我尝试将一些日志放在焦点属性上时,下面是我关注 ComboBox 时的输出(最后一个选项作为值):
ComboBox focused : true
ComboBox focused : false
Run Code Online (Sandbox Code Playgroud)
焦点立即关闭!
唯一让我困惑的是“为什么只有最后一个选项?? ”。我知道通常会出现问题/错误。但与最后一个选项的特殊关系,我无法理解:)
不管怎样,我尝试了不同的方法来使下拉隐藏和焦点起作用,但没有任何效果。你们有什么建议(解决方法)来解决这个问题吗?
下面是工作演示:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ComboBoxDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
ComboBox<String> comboBox = new ComboBox<>();
comboBox.getItems().addAll("One", "Two", "Three", "Four");
comboBox.getSelectionModel().select("Four"); // Change value to any other options, it …Run Code Online (Sandbox Code Playgroud) 如果内容具有多行 FlowPane,我会遇到 SplitPane 分隔符的问题。如果 FlowPane 在一行中呈现,则没有问题。如果 FlowPane 有多于一行,则内容部分会发生变化。
行数越多,移位越大。
为了演示这个问题,下面是一个快速演示。该演示包含三个垂直 splitPane,其中每个 SplitPane 都有不同编号的 FlowPane。行数。(第一个 splitPane - 1 行,第二个 SplitPane - 2 行,第三个 SplitPane - 3 行)
当使用 1 个 FlowPane 行调整 splitPane 大小时,没有问题,一切正常。然而,如果我调整第二个 splitPane 的大小,内容就会从所需的位置移动,从而在 SplitPane 中留下空白空间。当调整第三个 splitPane 的大小时,空间甚至更大。
我相信这应该是 SplitPane-FlowPane 计算中的一些问题(或者我也可能是错的)。但在这个阶段,我不是试图找出根本原因(这将在 JavaFX 源代码中的某个地方),而是更迫切地想通过一些解决方法来解决这个问题。
我尝试了几种方法,例如绑定高度、设置一些区域常量等,但都没有奏效。FlowPane的所有高度计算确实是正确的。
你们中的任何人对我如何解决这个问题有任何建议吗?
注意:该问题可以在所有版本的 JavaFX 中重现
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.SplitPane;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
@SuppressWarnings("javadoc")
public class SplitPaneDividerIssueDemo extends …Run Code Online (Sandbox Code Playgroud) 我在 VirtualFlow 中遇到了一种行为,不确定这是否是内存泄漏或者是否是这样设计的。
在 TableView 中,我希望当不使用 TableRow 实例时,它们应该能够被垃圾收集。但是,当我按照以下步骤操作时:
步骤#1:我打开了一个带有 TableView 的阶段,其中没有数据。我检查了内存中是否有 TableRow 的实时实例,但没有看到任何实例(这是我所期望的)。
步骤#2:我用一些数据填充了 TableView,这会根据所需的空间生成 TableRows。在我的场景中,假设它生成了 38 个 TableRow 对象实例。
步骤#3:我清除了 TableView 中的项目并显示占位符消息。当我检查 TableRow 实例时(执行多次 GC 后),它仍然在 VirtualFlow 的cellsArrayLinkedlist 中强保留了 TableRow 的所有 38 个引用,如下图所示:
这是内存泄漏还是已经考虑到的预期行为?
这是我用来检查上述场景的代码:
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TableViewMemoryLeakDemo extends Application {
public …Run Code Online (Sandbox Code Playgroud) 我试图了解何时在JavaFX中使用EventDispatcher。我非常了解捕获和冒泡的所有事件机制。但是我仍然对EventDispatcher的目的感到困惑。因为我可以使用过滤器和处理程序来完成大部分工作。
有人可以解释一下实际目的是什么以及如何使用此EventDispatcher吗?
谢谢。
我有:
public class TaskCell extends ListCell<Activity>...
..
private TextField textField = new TextField();
private HBox content = new HBox(..textField..);
@Override
public void updateItem(final Activity activity, boolean empty) {
super.updateItem(activity, empty);
...
textField.setText(activity.getTitle());
setGraphic(content);
}
Run Code Online (Sandbox Code Playgroud)
内容是一个带有 TextField 和其他控件的 HBox。
通过单击 或 通过以下方式选择列表项:
listView.getSelectionModel().select(1);
Run Code Online (Sandbox Code Playgroud)
起作用并选择整个项目。现在我想使用 Key.Tab 选择内部 TextField 进行编辑。这怎么可能?问题不是关于 KeyEvents,而是如何在所选 ListItem 上的 TextField(任何控件)上获取 requestFocus。
最好且仅部分有效的解决方案:
TaskCell selectedTaskCell = (TaskCell) listView.lookup(".cell:selected");
HBox hBox = (HBox) selectedTaskCell.getGraphic();
TextField textField = (TextField) hBox.getChildren().get(1);
textField.requestFocus();
textField.setVisible(false);
Run Code Online (Sandbox Code Playgroud)
这确实通过调试得到了正确选择的单元格。但是 requestFocus/setVisible 总是在第一个列表项上完成。从逻辑上讲,随着 ListCell 被重用..如何将焦点放在所选项目上?谢谢。