2013-11-14 79 views
3

我知道這通常不是必需的,但對於我的測試框架,我需要能夠替換舞臺使用的場景(這是必要的,因爲我不想爲每個測試分叉一個新的JVM,顯然,我們無法重新啓動JavaFX應用程序,至少在JavaFX 2中不能)。如何在舞臺中更換場景後獲取正確的場景位置?

但是,這打破了我的測試,因爲這樣做後,場景開始報告一個不正確的位置(所以我無法找到我的節點絕對位置在屏幕上)。

下面是重現問題的完整代碼。我相信這是JavaFX的一個錯誤,但我想知道是否有人能先看到任何問題,或者幫我解決方法:

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.geometry.Point2D; 
import javafx.scene.Scene; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

import java.util.concurrent.CountDownLatch; 

public class BugWithScene { 
static CountDownLatch latch = new CountDownLatch(1); 

public static void main(String[] args) throws Exception { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      Application.launch(MyApp.class); 
     } 
    }).start(); 

    latch.await(); 
    // sleep a little so we can see the Scene changing 
    Thread.sleep(500); 

    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      printSceneLocation(); 
      // here we replace the Scene - and now the Scene location becomes 0,0 
      MyApp.stage.setScene(createColorfulScene(Color.BLUE)); 
      printSceneLocation(); 
     } 
    }); 

} 

public static void printSceneLocation() { 
    System.out.println(new Point2D(MyApp.stage.getScene().getX(), MyApp.stage.getScene().getY())); 
} 

public static Scene createColorfulScene(Color color) { 
    VBox root = new VBox(); 
    root.setSpacing(0); 
    root.getChildren().setAll(new Rectangle(40, 50, color)); 
    return new Scene(root, 50, 60); 
} 

public static class MyApp extends Application { 
    static Stage stage; 

    @Override 
    public void start(Stage stage) throws Exception { 
     stage.setScene(createColorfulScene(Color.RED)); 
     stage.show(); 
     MyApp.stage = stage; 
     latch.countDown(); 
    } 
} 

} 

運行這段代碼打印如下:

Point2D [x = 3.0, y = 24.0] 
Point2D [x = 0.0, y = 0.0] 

我預計第二點應該與第一點相同。第一個是正確的(將鼠標移動到窗口的絕對座標,這個座標移到了這個數量上,你會到達預期的地方),第二個是錯誤的。

這可能是Linux特有的,不知道......試過Linux Mint的15,與Java 1.7.0_45-B18

+0

隱藏,再次顯示窗口,解決了問題,但是我想避免使用一個非常暴力的解決方案。 – Renato

+0

我認爲這是特定於您的操作系統。我使用Java7u45和Java8b115在Windows 7上運行了您的應用程序,並且所有報告的點值都具有相同的x和y座標。 – jewelsea

+0

謝謝。我也證實這並不影響Windows。 – Renato

回答

2

這是JavaFX的用於Linux的know bug。它在尚未發佈的JavaFX 2更新中得到修復(請參閱鏈接中的修訂版本字段)。

除了您提到的解決方法之外,替代解決方案可能是替換場景的根節點。我知道這適用於這個目的(至少在Windows上)。

+0

謝謝。我之前正在替換根目錄,但我需要替換整個場景才能重新啓動一個或多個創建自己場景的應用程序,因此,替換根目錄並不是一個完整的解決方案。 – Renato

+0

由minisu引用的RT-19352錯誤在18個月前被修復,我認爲它現在已經被包含在一個已發佈的JavaFX版本中,但也許minisu是正確的,它還沒有被包含進來(我對這個問題留了言論在問題追蹤器要求澄清,你可以[檢查問題的答覆](https://javafx-jira.kenai.com/browse/RT-19352)以獲得明確的答案)。無論如何,我不確定Renato是否遇到完全相同的問題,因此Renato可能仍然值得在錯誤跟蹤器中提交一個新問題。 – jewelsea

+0

感謝您的建議。我再次檢查了Windows 7中沒有發生這個問題。我同意你的看法,我的問題似乎與RT-19352不一樣。場景更新正確,只是其位置報告不正確。我會提交一個錯誤。 – Renato