当前位置: 首页 > 面试题库 >

在JavaFX中明确定位节点

张高澹
2023-03-14
问题内容

单击按钮后,它会更改其位置。

但是当我移动鼠标时,按钮又回到场景的中心,为什么呢?

我有以下代码

public class HolaMundo extends Application {

    Button btn;
    Scene scene;

    @Override
    public void start(Stage primaryStage) {
        btn = new Button();
        btn.setText("Hola Mundo");

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

        scene.setOnMouseMoved(new EventHandler<MouseEvent>(){

            @Override
            public void handle(MouseEvent t) {
                 btn.setText(String.valueOf(t.getX() ));
            }
        });

        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                btn.setLayoutX(Math.random() * (300 - btn.getWidth()));
                btn.setLayoutY(Math.random() * (250 - btn.getHeight())); 
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

问题答案:

建议的方法

对于您的特定代码段,也许使用Pane而不是StackPane是最好的方法。

为什么您的代码无法满足您的要求

如果要手动设置布局值,请不要使用会自动为您设置布局值的布局窗格(例如StackPane)。如果使用布局窗格,则下次布局窗格执行布局传递时(例如,调整其大小或场景图中某些内容或位置变脏),您显式设置的布局值将被自动覆盖。

明确布置节点的选项

如果要在JavaFX中显式布局项目,请执行以下一项操作:

  1. 子区域(Region)并重写layoutChildren。
  2. 如果需要使用CSS对容器进行样式设置或实现调整大小功能,请将内容放在窗格中。
  3. 如果您不需要使用CSS设置容器样式或实现调整大小功能,则可以将您的内容放在“ 组”中。

有关节点定位的相关建议

如果要使用预定义的布局管理器自动布局组件,但要从其默认位置调整或临时修改某些组件的位置,则可以调整translateX / Y值,而不是layoutX /
Y值。根据translateX的定义:

节点的最终平移将计算为layoutX +
translateX,其中layoutX建立节点的稳定位置,translateX可以选择对该位置进行动态调整。此变量可用于更改节点的位置,而不会影响其layoutBounds,这对于设置节点的位置动画效果非常有用。

这意味着布局管理器可以使用来计算子项的默认位置layoutX,而您可以使用来从默认位置调整位置translateX



 类似资料:
  • 问题内容: 在JavaFX中获取节点绝对位置的最佳方法是什么? 假设我们在窗格(Hbox,Stackpane或任何其他窗格)中有一个节点,并且它本身可能有一个父节点。 我想获取该节点的绝对位置,并在另一个窗格中使用它。 问题答案: 这取决于您所说的“绝对”的含义。节点有一个坐标系,父节点有一个坐标系,父节点有一个坐标系,依此类推,最终有一个坐标系和一个屏幕坐标系(可能是物理显示设备的集合)。 您可

  • 好吧,这变得有点复杂,涉及到所有不同的节点。如有可能,请随时提供简化建议。 我试图用自定义对象填充JavaFXListView,并用自定义节点格式化。 我有一个名为Contact的自定义对象,它的定义如下: 下面是我希望ListView中的每个联系人显示为的示例。 此自定义节点(ContactCell)由一个VBox根节点(顶部有一个用于联系人姓名的标签)和一个用于堆叠两部电话的VBox以及一个用

  • 我是JAVAfx的新手,我正在尝试编写一个web浏览器。我面临的问题是:-我想把屏幕左下方的按钮放在右下方。 我正在尝试这段代码,但它不起作用。谁来帮帮我

  • 有什么方法可以确定已经附加到场景但设置为不可见的节点的边界(尤其是高度和宽度)吗? 我想仅在其宽度超过100px时才在屏幕上显示标签...但它始终为 0: sysout的结果:(还有n.getWidth()也好不到哪里去) BoundingBox[minX: 0.0, minY: 0.0, minZ: 0.0,宽度: 0.0,高度: 0.0,深度: 0.0, maxX: 0.0, maxY: 0.

  • 我有一个窗格(1440x800)和一个节点(400x300),我需要在这个窗格内移动。所以对于窗格,我采用了StackPane,对于Node,我采用了VBox。 这是移动节点的控制器。 当用户单击节点的标题时,然后按下的X和Y被保存并在中使用。代码按我需要工作。唯一的问题是鼠标移动和节点模式之间有一点延迟。 我尝试在JVM中添加以下设置 但没用,也许是因为我用Linux-不知道。 在JavaFX中

  • 为了在JavaFX11中创建Jasper报表,我使用了动态报表。我正在Swing节点中加载报表,但Jasper报表只有在我单击stack窗格区域时才会出现,而所有其他组件只有在我悬停在所有这些组件上时才可见。组件和报表内容不是立即加载的,而不是在鼠标悬停时显示的,而报表是在滚动到堆栈窗格上时显示的。 因为这是Java8中的bug,并且似乎已经解决了,但是在Java11中,我也遇到了同样的问题。 更