使用setScene切换fxml场景在Mac上挂起

时间:2014-01-22 22:03:59

标签: java swing javafx deadlock

我们有一个包含多个场景的单个舞台的JDialog。每个场景都有一个下一个按钮。当用户点击“下一步”时,我们调用stage.setScene。这在Windows和Linux上运行良好,但在Mac上,setScene永远不会返回。应用程序挂起,似乎是一个线程死锁。这是一个重现问题的示例应用程序。我们还尝试了各种java 7版本和java8预发行版。我们认为我们找到了一些解决方法,但我们想了解为什么这段代码在Mac上存在问题。带有错误的示例应用程序:

public class SampleFxInsideSwing
{  
public static void main(String[] args)
{
    SwingUtilities.invokeLater(new Runnable() 
    { 
        public void run() 
        { 
            new SampleFxInsideSwing().initFX(); 
        } 
    });    
}  

private void initFX() 
{
    JDialog dialog = new JDialog();
    dialog.setSize(new Dimension(500,500));
    final JFXPanel stage = new JFXPanel();
    dialog.add(stage);

    Platform.runLater(new Runnable() 
    {
        @Override
        public void run() 
        {
            Button nextButton = new Button("Next");
            nextButton.setOnAction(new EventHandler<ActionEvent>() 
            {
                //@Override 
                public void handle(ActionEvent event) 
                {
                    try
                    {
                        System.out.println("Clicked");
                        AnchorPane parent = FXMLLoader.load(SampleFxInsideSwing.class.getResource("SampleFxml.fxml"));
                        Scene secondScene = new Scene(parent);
                        stage.setScene(secondScene);
                        System.out.println("Displaying second scene!");
                    } 
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });

            Group group = new Group();
            group.getChildren().add(nextButton);
            Scene scene1 = new Scene(group);
            stage.setScene(scene1);
        }
    });

    dialog.setVisible(true);
}   
}

0 个答案:

没有答案