2013-12-22 102 views
19

這個小JavaFX的測試應用JavaFX:爲什麼stage.setResizable(false)會導致額外的邊距?

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class ApplicationWithNonResizableStage extends Application { 

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

    @Override 
    public void start(final Stage primaryStage) throws Exception { 
     final Rectangle rectangle = new Rectangle(200, 100, Color.POWDERBLUE); 
     final BorderPane pane = new BorderPane(rectangle); 
     final Scene scene = new Scene(pane); 
     primaryStage.setScene(scene); 
     primaryStage.setResizable(false); 
     primaryStage.show(); 
    } 
} 

產生與不需要填充的窗口:

stage with margin

刪除通話primaryStage.setResizable(false)也消除了影響:

stage without margin

是什麼出錯了?

+0

你能找到解決方案嗎?它也影響其他組件:http://stackoverflow.com/questions/22620919/combobox-options-receive-margin-upon-making-the-stage-resizable – tvkanters

+0

@TVK:我只能解決舞臺問題。 –

+0

對我來說看起來像一個bug,你可能會考慮在fx issue tracker – kleopatra

回答

39

正如已經評價說,這個不同!/可調整大小的氣味就像一個錯誤的行爲(有人可能會考慮提出一個問題;-)

較短(比手動調整大小)的方式解決方法是明確的適應階段到場景:

primaryStage.setScene(scene); 
primaryStage.setResizable(false); 
primaryStage.sizeToScene(); 

只注意到這適用於jdk8,但不適用於jdk7。

爲方便起見,錯誤更新:由jewelsea提交的原始報告被關閉爲(在新座標中)https://bugs.openjdk.java.net/browse/JDK-8089008的副本 - 仍然開放,評論爲只贏。

+3

創建錯誤報告[RT-36413對於不可調整大小的階段,初始階段大小設置不正確](https://javafx-jira.kenai.com/browse/RT-36413)。 – jewelsea

0

嘗試爲您想要的框架尺寸創建尺寸 - Dimension name = new Dimension(height,width) - 然後將該尺寸尺寸設置爲矩形BorderPane和Scene。你確實希望一切都是相同的大小正確的?

+0

上提出問題。謝謝你的回覆。手動設置大小並不能解決問題,因爲階段也會比引入'setResizable(false)'時大。 –

+0

嘗試切換'setResizable(false)'和'setScene(Scene)'的順序它不重要,但有時它確實如此。 –

2

雖然這不是解釋,它解決了這個問題:

@Override 
public void start(final Stage primaryStage) throws Exception { 
    final Dimension d = new Dimension(210, 110); 
    final Rectangle rectangle = new Rectangle(d.width, d.height, Color.POWDERBLUE); 
    final BorderPane pane = new BorderPane(rectangle); 
    pane.maxWidth(d.height); 
    pane.maxWidth(d.width); 
    final Scene scene = new Scene(pane, d.width, d.height); 
    primaryStage.setScene(scene); 
    primaryStage.setResizable(false); 
    primaryStage.setWidth(d.width); 
    primaryStage.setHeight(d.height); 
    primaryStage.show(); 
} 

關鍵是在合適的時間設置寬度和Stage的高度。

相關問題