2016-05-30 16 views
1

我已經減少了我對此的重新創建。實例化ToggleButton的行會導致我的舞臺失去其填充顏色;它變白了。我剛開始使用JavaFX,所以請讓我知道,如果我正在做我不應該做的事情,請點擊這裏。這是在Windows 7 SP1上使用jre1.8.0_92和Eclipse Neon(jfx8_2.3.0插件)。簡單地創建一個新的控件後,舞臺失去填充(漸變)

public class Main extends Application { 

    public static void main(String[] args) { 

     if(args.length > 0) { 
      String s = args[0].toLowerCase(); 
      if(s.equals("full")) 
        Machine.isFullScreen = true; 
     } 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     Machine.startMachine(primaryStage); 
    } 
} 

public class Machine { 

    static boolean isFullScreen = false; 
    static Rectangle2D screenRect, backRect; 
    static Stage backStage; 
    static Scene backScene; 
    static Pane backPane; 

    private Machine() {} 

    static public void startMachine(Stage primaryStage) { 

     // backscreen 
     startScene(primaryStage); 

     // This line causes the fill to be lost 
     ToggleButton foo = new ToggleButton("hi"); 
    } 

    static private void startScene(Stage primaryStage) { 

     // Stage 
     backStage = primaryStage; 
     backStage.initStyle(StageStyle.UNDECORATED); 
     backStage.setFullScreen(isFullScreen); 
     screenRect = Screen.getPrimary().getBounds(); 
     if(!isFullScreen) { 
      int w = 1000, h = 500, t = 20; 
      backStage.setWidth(w); 
      backStage.setHeight(h); 
      backStage.setX((screenRect.getWidth() - w)/2); 
      backStage.setY(t); 
     } 
     backRect = new Rectangle2D(backStage.getX(), backStage.getY(), 
       backStage.getWidth(), backStage.getHeight()); 

     // Scene 
     backScene = new Scene(backPane = new Pane()); 
     // backScene.getStylesheets().add(Machine.class.getResource("mainStyle.css").toExternalForm()); 
     // backScene.getRoot().setStyle("-fx-background-color: #CCFF99;"); 
     backScene.setFill(new LinearGradient(0,0,1,1, true, CycleMethod.NO_CYCLE, 
      new Stop[]{ 
        new Stop(0,Color.web("#4977A3")), 
        new Stop(0.5, Color.web("#B0C6DA")), 
        new Stop(1,Color.web("#9CB6CF")), })); 
     // Logo 
     Text logo = new Text("AMT"); 
     logo.setFill(Color.DEEPSKYBLUE); 
     Font font = Font.font("Times New Roman", FontWeight.BOLD, FontPosture.ITALIC, 96); 
     logo.setFont(font); 
     logo.setX(100); 
     logo.setY(150); 
     backPane.getChildren().add(logo); 
     backStage.setScene(backScene); 
     backStage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH); 
     backStage.show(); 
    } 
} 

回答

1

setFill() API表明這可能是樣式表效果。當實例化第一個Control時,默認樣式表是靜態安裝的。如果該樣式表爲Modena,則「默認填充設置爲淺灰色。」建議herehere,而不是backScene.setFill(),請嘗試backPane.setBackground()

image

// Scene 
backPane = new Pane(); 
backScene = new Scene(backPane); 
LinearGradient linearGradient = new LinearGradient(
    0, 0, 1, 1, true, CycleMethod.NO_CYCLE, 
    new Stop(0, Color.web("#4977A3")), 
    new Stop(0.5, Color.web("#B0C6DA")), 
    new Stop(1, Color.web("#9CB6CF"))); 
backPane.setBackground(new Background(new BackgroundFill(
    linearGradient, CornerRadii.EMPTY, Insets.EMPTY))); 

順便說一句,注意,LinearGradientvarargs構造函數的參數允許您添加的Stop直接實例,而無需創建一個新的數組。

+0

非常感謝!場景填充消失(或將會)是否有合乎邏輯的原因?因爲我還沒有把按鈕放在任何場景中(在這個例子中)。它是否進入了整個節點集合? –

+1

@MarkMeyers:我不確定,但['setFill()'](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Scene.html#setFill-javafx。 scene.paint.Paint-)API提示樣式表效果。 – trashgod