JavaFX静态与非静态

时间:2016-04-22 11:36:19

标签: java javafx static

美好的一天,

为什么JavaFX有问题,如果我在方法之外创建一个静态标签,但是doesen对于像球体或矩形这样的形状有同样的问题。

以下工作正常:

id  volume  saturation  time_delay_normalised     speed  \
    27WESTBOUND     580    0.351515                     57  6.542484   
    27WESTBOUND     588    0.356364                    100  5.107143   
    27WESTBOUND     475    0.287879                     64  6.256250   
    27EASTBOUND     401    0.243030                     59  6.458065   
    27EASTBOUND     438    0.265455                     46  7.049296   
    27EASTBOUND     467    0.283030                     58  6.500000   

       BPR_free_speed  BPR_speed  Volume  time_normalised  free_capacity  
             17.88  15.913662     580         1.593750          475.0  
             17.88  15.865198     588         2.041667          475.0  
             17.88  16.511613     475         0.666667          475.0  
             17.88  16.882837     401         1.091458          467.0  
             17.88  16.703004     438         1.479167          467.0 
             17.88  16.553928     467         0.960417          467.0

但是这会产生一个例外:

static Rectangle upperBorder = new Rectangle(0, 0, 10, 10);

我必须通过以下方式创建Label:

static Label myScore = new Label("Test");

没有"静态"关键字。

这是错误:

Label myScore = new Label("Test");

1 个答案:

答案 0 :(得分:2)

错误很可能不是由static关键字引起的。

考虑这个简单的测试程序:

public class Test {

   static Rectangle a   = new Rectangle(0, 0, 10, 10);
   static Label     b   = new Label("b");

   public static void main(String[] args) {
   }
}

启动时会引发异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
   at Test.<clinit>(Test.java:7)
Caused by: java.lang.IllegalStateException: Toolkit not initialized
   at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273)
   at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268)
   at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:550)
   at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512)
   at javafx.scene.control.Control.<clinit>(Control.java:87)
   ... 1 more

这暗示JavaFX应用程序平台尚未启动。在此示例中删除static关键字时,错误似乎消失了,但这是因为代码中未使用标签b

启动与JavaFX应用程序相同的类可确保在创建第一个Control之前初始化Platform:

public class Test extends Application {

   static Rectangle a   = new Rectangle(0, 0, 10, 10);
   static Label     b   = new Label("b");

   public static void main(String[] args) {
      launch(args);
   }

   @Override
   public void start(Stage primaryStage) throws Exception {
      // TODO Auto-generated method stub
   }
}

代码中RectangleLabel之间的区别在于LabelControlRectangle不是。如果没有正在运行的JavaFX平台,则无法实例化Label