2015-02-05 93 views
3

设置某些特定的跨度配置时,GridPane自动调整存在一个问题。JavaFX 8 - GridPane自动调整问题

以下配置工程,我想到:

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.Border; 
import javafx.scene.layout.BorderStroke; 
import javafx.scene.layout.BorderStrokeStyle; 
import javafx.scene.layout.BorderWidths; 
import javafx.scene.layout.CornerRadii; 
import javafx.scene.layout.GridPane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class GridPaneWidthIssue extends Application { 

    public static void main(String... arguments) { 
     launch(arguments); 
    } 

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

     GridPane gridPane = new GridPane(); 

     BorderStroke borderStroke = new BorderStroke(Color.RED, 
       BorderStrokeStyle.SOLID, CornerRadii.EMPTY, 
       BorderWidths.DEFAULT); 

     Border border = new Border(borderStroke); 
     gridPane.setBorder(border); 
     gridPane.setGridLinesVisible(true); 
     gridPane.setHgap(2); 
     gridPane.setVgap(2); 
     gridPane.setPadding(new Insets(10)); 

     Label column0 = new Label("Column 0"); 
     Label column1 = new Label("Column 1"); 
     Label column2 = new Label("Column 2"); 
     Label column01 = new Label("Span column 0 and 1"); 
     Label column012 = new Label("Span column 0, 1 and 2"); 

     gridPane.add(column0, 0, 0); 
     gridPane.add(column1, 1, 0); 
     gridPane.add(column2, 2, 0); 
     gridPane.add(column01, 0, 1, 2, 1); 
     gridPane.add(column012, 0, 2, 3, 1); 

     Scene scene = new Scene(gridPane); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

我不能发布图片还没有证明这一点,但我可以确认以下断言:

** gridpane.width = column0.width + column1.width + column2.width

当我行0中删除标签,我得到了下面的代码:

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.Border; 
import javafx.scene.layout.BorderStroke; 
import javafx.scene.layout.BorderStrokeStyle; 
import javafx.scene.layout.BorderWidths; 
import javafx.scene.layout.CornerRadii; 
import javafx.scene.layout.GridPane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class GridPaneWidthIssue extends Application { 

    public static void main(String... arguments) { 
     launch(arguments); 
    } 

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

     GridPane gridPane = new GridPane(); 

     BorderStroke borderStroke = new BorderStroke(Color.RED, 
       BorderStrokeStyle.SOLID, CornerRadii.EMPTY, 
       BorderWidths.DEFAULT); 

     Border border = new Border(borderStroke); 
     gridPane.setBorder(border); 
     gridPane.setGridLinesVisible(true); 
     gridPane.setHgap(2); 
     gridPane.setVgap(2); 
     gridPane.setPadding(new Insets(10)); 

     Label column0 = new Label("Column 0"); 
     Label column1 = new Label("Column 1"); 
     Label column2 = new Label("Column 2"); 
     Label column01 = new Label("Span column 0 and 1"); 
     Label column012 = new Label("Span column 0, 1 and 2"); 

     // gridPane.add(column0, 0, 0); 
     // gridPane.add(column1, 1, 0); 
     // gridPane.add(column2, 2, 0); 
     gridPane.add(column01, 0, 1, 2, 1); 
     gridPane.add(column012, 0, 2, 3, 1); 

     Scene scene = new Scene(gridPane); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

而结果是不正确的:

gridpane.width> column0.width + column1.width + column2.width

我没有验证,但我猜是:

gridpane.width = column0.width + column1.width + column0.width + column1.width + column2.width

JavaFX问题或我误解了Gridpane调整策略?

案例1:OK

enter image description here

案例2:KO(在GridPane空白空间)

enter image description here

+1

你能澄清你的意思吗?我会将你的伪代码'column0.width'解释为'Label column0;'等的宽度。显然这在你的第二个例子中是没有意义的,因为'column0.width'将是零(类似于其他),因为这些标签不显示。 (不管怎样,第一个例子中都不是这样。)那么你是指实际列的宽度?如果是这样,因为在第一个例子中它必须包含'hgap' ......但在第二个例子中它变得平凡无奇。所以你是什么意思? (我会upvote,所以你可以张贴图像。) – 2015-02-05 18:58:41

+0

你是对的,通过专栏0我不是指标签,而是列本身,我没有在我的伪代码中包含hgaps。我添加了空白来制作截图明确。我会尽快上传这两种情况的截图,你会清楚地看到问题:在第二种情况下,column2右边有一个空的空间。这个空间在gridpane里面。在这个特定的例子中,当column0或column1增长时,这个空间会增长。这就是为什么我猜空白空间宽度=列0的宽度+列1的。这只是一个猜测,但无论如何,空荡荡的空间令人讨厌。 – Jonathan 2015-02-06 07:26:39

回答

0

你看到额外的空间在GridPane因为权当添加column01标签(并且您不再有三列但只有一列)时,添加column012标签和一个2的colspan时,您的殖民地为3。记住GridPane是一个表格,你需要保持它的列平衡,并跨越它的列/行限制。在你的情况下,空白空间只是GridPane内部任何标签范围之外的第三列。

更改此:

gridPane.add(column012, 0, 2, 3, 1); 

要这样:

gridPane.add(column012, 0, 2, 2, 1); 

你会看到

Image without extra columns

理想的情况下,如果你正在计划只有一列,你应该删除该colspan和rowspan,只是离开这个:

gridPane.add(column01, 0, 1); 
gridPane.add(column012, 0, 2); 

如果你继续列平衡你的GridPane的宽度是可以预测的,因为它会被计算为:插图+缺口+每列宽度

你可能也想看看的ColumnConstraints类根据自己的喜好自定义每个列的行为。

希望这会有所帮助!