我知道這通常不是必需的,但對於我的測試框架,我需要能夠替換舞臺使用的場景(這是必要的,因爲我不想爲每個測試分叉一個新的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
隱藏,再次顯示窗口,解決了問題,但是我想避免使用一個非常暴力的解決方案。 – Renato
我認爲這是特定於您的操作系統。我使用Java7u45和Java8b115在Windows 7上運行了您的應用程序,並且所有報告的點值都具有相同的x和y座標。 – jewelsea
謝謝。我也證實這並不影響Windows。 – Renato