我知道这通常是不必要的,但对于我的测试框架,我需要能够替换由Stage使用的Scene(这是必需的,因为我不想为每个单独的测试分支出一个新的JVM,显然我们不能在JavaFX 2中重新启动JavaFX应用程序)。
然而,这会导致我的测试失败,因为在这样做之后,Scene会报告一个错误的位置(所以我无法找到我的节点在屏幕上的绝对位置)。
以下是完整的代码来再现这个问题。我相信这是JavaFX的一个错误,但我想知道是否有人能先看到任何问题或帮助我找到一个解决方法:
运行此代码将打印以下内容:
然而,这会导致我的测试失败,因为在这样做之后,Scene会报告一个错误的位置(所以我无法找到我的节点在屏幕上的绝对位置)。
以下是完整的代码来再现这个问题。我相信这是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。