小编Sai*_*dem的帖子

JavaFX:如何在不关注主窗口的情况下关闭子窗口

我试图在一段时间后以编程方式关闭子窗口。此子窗口initOwner设置有主阶段。但是在关闭此子窗口时,主窗口将变得集中。有什么办法(以编程方式)关闭子窗口而不关注主窗口吗?

以下是我的问题的快速演示。我尝试了所有可能的方式来关闭窗口。重现步骤:

  1. 启动应用程序后,单击按钮以打开子窗口。此子窗口将在10秒后自动关闭。

  2. 同时打开任何其他应用程序(记事本,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)

javafx javafx-2 javafx-8

7
推荐指数
1
解决办法
140
查看次数

当方向为垂直时,ControlsFX RangeSlider 滞后

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)

java javafx controlsfx

7
推荐指数
1
解决办法
226
查看次数

JavaFX:如何管理阶段的z-index

有什么方法可以管理多个阶段的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 stage

5
推荐指数
1
解决办法
69
查看次数

TreeView 中的 JavaFX 布局问题

最近,我将应用程序从 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 javafx-8 javafx-18

5
推荐指数
1
解决办法
544
查看次数

FX 19 中组合框焦点问题

升级到最新的 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)

javafx javafx-19

5
推荐指数
1
解决办法
243
查看次数

当内容具有 FlowPane 时,JavaFX SplitPane 内容的布局不正确

如果内容具有多行 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)

javafx splitpane flowpane

5
推荐指数
1
解决办法
116
查看次数

VirtualFlow 中的 JavaFX 内存泄漏?

我在 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

2
推荐指数
1
解决办法
136
查看次数

JavaFX-EventDispatcher和EventFilter之间的区别

我试图了解何时在JavaFX中使用EventDispatcher。我非常了解捕获和冒泡的所有事件机制。但是我仍然对EventDispatcher的目的感到困惑。因为我可以使用过滤器和处理程序来完成大部分工作。

有人可以解释一下实际目的是什么以及如何使用此EventDispatcher吗?

谢谢。

javafx event-handling

1
推荐指数
1
解决办法
551
查看次数

在 JavaFX ListView 中选择自定义列表单元格的内部控件

我有:

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 被重用..如何将焦点放在所选项目上?谢谢。

listview javafx

0
推荐指数
1
解决办法
63
查看次数