当前位置: 首页 > 知识库问答 >
问题:

场景生成器和应用程序中的不同锚定结果

欧阳鸿哲
2023-03-14

我在Scene Builder中生成了以下FXML。当我在场景生成器中预览它并调整窗口大小时,内部分割视图将保持自身和锚定视图之间的间距。但是,当我在应用程序中运行FXML时,它不会。有什么想法吗?我正在使用JavaFX2.2。51

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane prefHeight="477.0" prefWidth="515.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="com.nm.haze.LibraryViewController">
  <children>
    <SplitPane dividerPositions="0.09484536082474226" focusTraversable="true" prefHeight="415.0" prefWidth="487.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="48.0">
      <items>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" />
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
          <children>
            <ListView prefHeight="371.0" prefWidth="425.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
          </children>
        </AnchorPane>
      </items>
    </SplitPane>
  </children>
</AnchorPane>

我的控制器代码:

package com.nm.haze;

import java.net.URL;
import java.util.ResourceBundle;

public class LibraryViewController extends BaseController {

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

    }
}

主代码

private static final String LIBRARY_SELECT = "LibrarySelect";
private static final String LIBRARY_VIEW = "LibraryView";

@Override
public void start(Stage primaryStage) throws IOException {
    SceneController sceneController = new SceneController(primaryStage, new SettingsManager());
    sceneController.loadScene(LIBRARY_SELECT);
    sceneController.loadScene(LIBRARY_VIEW);
    if (sceneController.setupNeeded()) {
        sceneController.setScreen(LIBRARY_SELECT);
    } else {
        sceneController.setScreen(LIBRARY_VIEW);
    }
    Group root = new Group();
    root.getChildren().addAll(sceneController);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}

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

场景控制器代码:

public class SceneController extends StackPane {

Map<String, Node> scenes = new HashMap<>();
Stage stage;
SettingsManager settingsManager;

public SceneController(Stage stage, SettingsManager settingsManager) {
    this.stage = stage;
    this.settingsManager = settingsManager;
}

public void addScene(String name, Node scene) {
    scenes.put(name, scene);
}

public void loadScene(String name) throws IOException {
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource(name + ".fxml"));
    Parent loadScreen = (Parent)myLoader.load();
    ((BaseController)myLoader.getController()).setSceneController(this);
    addScene(name, loadScreen);
}

public void setScreen(final String name) {
    List<Node> children = getChildren();
    Node scene = scenes.get(name);
    if(scene != null) {
        if (children.size() > 0) {
            children.remove(0);
        }
        children.add(0, scene);

    } else {
        throw new IllegalArgumentException("Scene has not been loaded");
    }
}

public Stage getStage() {
    return stage;
}

public boolean setupNeeded() {
    return settingsManager.setupNeeded();
}

}

为了弄清楚问题是什么,请查看下面的前后截图。ListViewAnchorPane之间的距离应保持不变(在场景生成器中也是如此)。

共有1个答案

太叔鹏云
2023-03-14

您只需修复SplitPane部分的最小和最大宽度,您不希望在调整窗口大小时更改其宽度!

在这里,我已经修复了左侧部分,通过在左侧设置AnchorPane的minWidthmaxWidth。你也可以对右侧做同样的事情,这取决于你的要求。

abcFxml。fxml

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane prefHeight="477.0" prefWidth="515.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="bounty.LibraryViewController">
  <children>
    <SplitPane dividerPositions="0.09484536082474226" focusTraversable="true" prefHeight="415.0" prefWidth="487.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="48.0">
      <items>
        <AnchorPane minHeight="0.0" minWidth="100.0" prefHeight="160.0" prefWidth="100.0" maxHeight="160.0" maxWidth="100.0" />
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
          <children>
            <ListView prefHeight="371.0" prefWidth="425.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
          </children>
        </AnchorPane>
      </items>
    </SplitPane>
  </children>
</AnchorPane>

控制器

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class LibraryViewController extends Application
{

    @Override
    public void start(Stage arg0) throws Exception {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("abcFxml.fxml"));
        AnchorPane pane = (AnchorPane) fxmlLoader.load();
        Scene scene = new Scene(pane);
        arg0.setScene(scene);
        arg0.show();

    }

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

}

截图

尺码1

尺寸2

编辑:根据用户更新

您面临的问题是因为您使用的。组本身无法调整大小!尝试将StackPane直接放到场景中(就像我做的那样),或者您可以使用任何其他容器,如VBOX/HBOX

@Override
public void start(Stage primaryStage) throws IOException {
    SceneController sceneController = new SceneController(primaryStage, new SettingsManager());
    sceneController.loadScene(LIBRARY_SELECT);
    sceneController.loadScene(LIBRARY_VIEW);
    if (sceneController.setupNeeded()) {
        sceneController.setScreen(LIBRARY_SELECT);
    } else {
        sceneController.setScreen(LIBRARY_VIEW);
    }
    primaryStage.setScene(new Scene(sceneController));
    primaryStage.show();
}

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

 类似资料:
  • 我希望此图表显示在场景生成器上。怎么可能。。??

  • 我通过扩展现有控件创建了一个新控件,我希望在JavaFX场景中使用这个新控件。我希望能够使用Scene Builder编辑我的场景,但在将新控件添加到FXML文件后,我在打开Scene Builder时遇到。 例如,下面是我创建的一个类,它扩展了: 将此控件添加到FXML文件后... 为什么Scene Builder找不到我的新控件?我需要做什么才能让它找到并能够使用我的新控件? 如果需要,下面是

  • 几个星期以来,我一直在想办法解决这个问题,现在我开始放弃了。我肯定做了什么根本错误的事情。不管怎样,这是我的情况。我以前用JavaFX做了一个简单的小程序,但现在发现了Scene Builder,并想用这个工具重新构建它。该项目包括几个经常重用的组件,如下面的组件。它由一个标签、一个滑块、一个文本字段和另一个自定义组件InfoIcon组成。 我已经了解到,在构建我称之为SliderVariable

  • 我正在用java开发一个聊天机器人项目,在GUI中我使用JavaFX、IDE eclipse和scene builder 8.4.1。 我在向文本区域添加背景图像时遇到问题。这是我所做的一个屏幕截图,它什么也没有显示(甚至没有错误)。 以下是场景生成器生成的fxml代码:

  • 我在一个java项目上工作,我处理了每一个功能,但当谈到GUI时,我是一个初学者。我想知道的是,我可以像在JavaFX中一样使用java在一个阶段中显示不同的场景吗?例如,我的起点是一个登录面板,登录后清空Jframe,并显示下一个veiw或场景。观点很多,怎么办?

  • 我对屏幕生成器有一些问题 对于某些fxml,它会在加载后发生creash。我尝试了很多次运行它,但它阻塞了,我必须终止这个进程。 fxml正常,内容在我的应用程序中正确显示。下面是导致场景生成器崩溃的FXML示例。