在 JavaFX 2 中使用 GirdPanes 时,我遇到了一些奇怪的布局行为。虽然它通常似乎在多个字段之间均匀地分布水平空间,但在其他一些情况下却不会这样做。这是一个显示效果的示例:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class TestDialog extends Stage {
public TestDialog() {
super();
setTitle("Test");
GridPane grid = new GridPane();
grid.setHgap(5);
grid.setVgap(5);
grid.setPadding(new Insets(10, 10, 10, 10));
final TextField tField1 = new TextField();
final TextField tField2 = new TextField();
tField2.setMaxWidth(200);
grid.add(createLabel("Field 1:"), 0, 0);
grid.add(tField1, 1, 0);
grid.add(createLabel("Field 2:"), 2, 0);
grid.add(tField2, 3, 0);
Pane pane = new Pane();
// pane.setMinSize(600, 100); // first row has weird layout behaviour
pane.setMinSize(100, 100); // first row is fine
pane.setStyle("-fx-background-color: black");
grid.add(pane, 0, 1, 4, 1);
grid.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
setScene(new Scene(grid));
}
private Label createLabel(String text) {
Label label = new Label(text);
label.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
return label;
}
public static void main(String[] args) {
TestApplication.main(args);
}
public static class TestApplication extends Application {
@Override
public void start(Stage stage) throws Exception {
TestDialog dialog = new TestDialog();
dialog.showAndWait();
}
public static void main(String[] args) {
launch(args);
}
}
}
在此示例中,如果按原样运行,对话框将很好地调整大小。如果额外窗格的最小大小更改为注释中的版本,那么事情就会出错:第一行中的额外空间将变成空白空间(而不是增加第一个字段),减少对话框大小需要它远离已经很小的第一场,留下完整的空白区域。
有没有办法让 GridPane 实际使用第一个字段的可用水平空间?我知道将对话大小减小到所需的最小值以下并不一定会产生良好的结果,但首先不扩大该领域对我来说似乎是完全错误的。
我从 JDK 1.7.0_21 开始使用 JavaFX。