Javafx 2 调整窗口大小时,UI组件[JavaFX Group]失去其位置。。。仅在水平滚动后发生

Javafx 2 调整窗口大小时,UI组件[JavaFX Group]失去其位置。。。仅在水平滚动后发生,javafx-2,Javafx 2,请浏览下面的图片。 在上图中,您可以发现水平滚动未启动。 现在访问相同内容的后滚动图像 现在在第二幅图中,您可以看到水平滚动已完成… JFXPanel内容水平滚动。。。哪个是完美的… 现在,第三幅图将描述问题 当它被最大化时,它会稍微拉伸一点以查看… 您可以看到JFXPanel内容已更改其原始位置… 此外,内容必须以X_位移=0.0[X-Cordinate]开始,这是在前两幅图像中自动完成的… 所有内容都是节点,如[矩形、直线等],之后所有内容都放在组节点中… 此组节点通过在滚动窗格中设置

请浏览下面的图片。

在上图中,您可以发现水平滚动未启动。
现在访问相同内容的后滚动图像

现在在第二幅图中,您可以看到水平滚动已完成…
JFXPanel内容水平滚动。。。哪个是完美的…
现在,第三幅图将描述问题

当它被最大化时,它会稍微拉伸一点以查看…
您可以看到JFXPanel内容已更改其原始位置…
此外,内容必须以X_位移=0.0[X-Cordinate]开始,这是在前两幅图像中自动完成的…
所有内容都是节点,如[矩形、直线等],之后所有内容都放在组节点中…
此组节点通过在滚动窗格中设置

js.setContent(Group node);  
每个组件都以给定的x,y坐标值放置。。那么,在进行最大化时,这是如何发生的?
请帮我找到根本原因

先谢谢你

以下是导致问题的一些事实

- Start Position of Scene : 0.0 
- Start Position of Group in Scene : 49.5 
- Width of the root : 364.5 


- Start Position of Scene : 0.0 
- Start Position of Group in Scene : 63.5 
- Width of the root : 364.5 

- Start Position of Scene : 0.0 
- Start Position of Group in Scene : 83.5 
- Width of the root : 364.5 
当我们水平拖动窗口时,组在场景中移动。。。这不应该发生。。。如何避免这个

好的。。。这是MCVE

有一个框架。包含垂直拆分的拆分窗格。
拆分窗格将显示两个JFXPanel的内容。
两个面板在相同的x坐标上有矩形,但Y坐标不同。
两个FXPanel都是水平滚动同步的。不是双向的。当您水平滚动下面板时,由于水平同步,上面板将被滚动

以下是fxPanel 1的代码

public class FxPanel1 extends JFXPanel
{
private ScrollPane scroll ;


public ScrollPane getJs() {
    return scroll;
}
public void setJs(ScrollPane js) {
    this.scroll = js;
}

private boolean initFX(JFXPanel fxPanel) {
    Scene scene = createScene();       
    fxPanel.setScene(scene);
    return true;
    //craneAssignmentChartView.setFxPanel(fxPanel);        
}
private Scene createScene() {
    Group root = new Group();

    Rectangle rect = new Rectangle(10.0, 20.0, 800, 40);
    rect.setFill(javafx.scene.paint.Color.TRANSPARENT); 
    rect.setStroke(javafx.scene.paint.Color.RED);

    AnchorPane anchor = new AnchorPane();
    anchor.getChildren().add(rect);

    GridPane grid = new GridPane();
    grid.setHgap(0);
    grid.setVgap(0);
    grid.setPadding(new Insets(0, 0, 0, 0));        
    grid.add(anchor, 1, 0); 

    root.getChildren().add(grid);

    ScrollPane scroll = new ScrollPane();
    scroll.setHbarPolicy(ScrollBarPolicy.ALWAYS);
    scroll.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
    scroll.setContent(root);
    setJs(scroll);
    return new  Scene(scroll, javafx.scene.paint.Color.WHITE);      
}

private void createUI(final JFXPanel fxPanel)
{
    Platform.runLater(new Runnable() {

        @Override
        public void run() 
        {
            initFX(fxPanel);                
        }
    });
}
public FxPanel1( JFXPanel fxPanel)
{
    createUI(fxPanel);
}
}
现在第二个fxPanel的代码看起来像

public class FxPanel2 extends JFXPanel
{
private ScrollPane scroll ;

public ScrollPane getJs() {
    return scroll;
}
public void setJs(ScrollPane js) {
    this.scroll = js;
}
private boolean initFX(JFXPanel fxPanel) {
    Scene scene = createScene();       
    fxPanel.setScene(scene);
    return true;
    //craneAssignmentChartView.setFxPanel(fxPanel);        
}
private Scene createScene() {
    Group root = new Group();

    Rectangle rect = new Rectangle(10.0, 180.0, 800, 40);
    rect.setFill(javafx.scene.paint.Color.TRANSPARENT); 
    rect.setStroke(javafx.scene.paint.Color.RED);

    AnchorPane anchor = new AnchorPane();
    anchor.getChildren().add(rect);

    GridPane grid = new GridPane();
    grid.setHgap(0);
    grid.setVgap(0);
    grid.setPadding(new Insets(0, 0, 0, 0));        
    grid.add(anchor, 1, 0); 

    root.getChildren().add(grid);

    ScrollPane scroll = new ScrollPane();
    scroll.setHbarPolicy(ScrollBarPolicy.ALWAYS);
    scroll.setVbarPolicy(ScrollBarPolicy.NEVER);
    scroll.setContent(root);
    setJs(scroll);
    return new  Scene(scroll, javafx.scene.paint.Color.WHITE);      
}

private void createUI(final JFXPanel fxPanel)
{
    Platform.runLater(new Runnable() {

        @Override
        public void run() 
        {
            initFX(fxPanel);                
        }
    });
}
public FxPanel2( JFXPanel fxPanel)
{
    createUI(fxPanel);
}
}
主类看起来像

public class DemoToCheckUIAlignment extends JFrame
{
public static void main(String[] args)
{
    final DemoToCheckUIAlignment demo = new DemoToCheckUIAlignment();
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {

            JFXPanel panel1 = new JFXPanel();
            FxPanel1 fxObj1 = new FxPanel1(panel1);

            JFXPanel panel2 = new JFXPanel();
            FxPanel2 fxObj2 = new FxPanel2(panel2);

            DemoToCheckUIAlignment frame = new DemoToCheckUIAlignment();
            frame.setSize(800, 500);               
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

            JSplitPane chartSplitPane = new JSplitPane();
            chartSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
            chartSplitPane.setDividerLocation(200);
            chartSplitPane.setDividerSize(2);
            chartSplitPane.setTopComponent(panel1);
            chartSplitPane.setBottomComponent(panel2);

            demo.provideScrollSyncBetweenFXPanels(fxObj1.getJs(), fxObj2.getJs());


            frame.getContentPane().add(chartSplitPane);
            //frame.getContentPane().add(panel2);
            frame.setVisible(true);
        }
    });
}


public static void provideScrollSyncBetweenFXPanels(final ScrollPane upperSP, final ScrollPane lowerSP)
{           

            lowerSP.hvalueProperty().addListener(new ChangeListener<Number>() 
            {               
                public void changed(ObservableValue<? extends Number> ov,
                        Number old_val, Number new_val) 
                {
                    upperSP.hvalueProperty().set(new_val.doubleValue());
                }
            });
}
}
public类demoocheckualiagnment扩展了JFrame
{
公共静态void main(字符串[]args)
{
最终Demoocheckuialignment演示=新Demoocheckuialignment();
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFXPanel panel1=新的JFXPanel();
FxPanel1 fxObj1=新的FxPanel1(panel1);
JFXPanel panel2=新的JFXPanel();
FxPanel2 fxObj2=新的FxPanel2(panel2);
Demoocheckuialignment frame=新的Demoocheckuialignment();
框架设置尺寸(800500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JSplitPane chartsplippane=新的JSplitPane();
chartSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
chartSplitPane.setDividerLocation(200);
chartSplitPane.setDividerSize(2);
chartSplitPane.setTopComponent(面板1);
chartSplitPane.setBottomComponent(面板2);
expanel之间的demo.providescrollsynchbeen(fxObj1.getJs(),fxObj2.getJs());
frame.getContentPane().add(chartSplitPane);
//frame.getContentPane().add(panel2);
frame.setVisible(true);
}
});
}
public static void提供XPanel之间的滚动同步(最终滚动窗格Upper SP,最终滚动窗格lowerSP)
{           
lowerSP.hvalueProperty().addListener(新的ChangeListener())
{               

更改公众假期(ObservalEvalue您可以使用ScrollPane对象的setFitToWidth来匹配特定维度。有关更多详细信息,请参阅页面下方的链接,调整滚动窗格中组件的大小,您可以在解决方案中找到更多内容

您可以尝试使用的子类而不是使用吗?例如,a。它将如何生效ective?我的意思是,组是否有如此大的开销…无论如何,我尝试过HBox,结果仍然是一样的。
Group
不能直接调整大小。因此,当窗口从角落调整大小时,它不会被场景调整大小。你能创建一个并发布它吗?我很确定问题在于使用组,但事情会变得复杂ar如果你可以发布的话。setFitToWidth方法为滚动窗格设置true,内容宽度缩小,并且从不水平滚动。这对我来说很有用。。。。。。