-
Notifications
You must be signed in to change notification settings - Fork 96
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Setting width of Labels #52
Comments
same question , I can't find width relative api, how to set adaptable width and height, like @Override
public void start(Stage primaryStage) throws Exception {
//Pane root = FXMLLoader.load(getClass().getResource("/layout/launcher.fxml"));
Pane root = new Pane();
primaryStage.setTitle("Demo");
List<String> strings = Arrays.asList("Africa", "Asia", "Shanghai", "中国", "美国");
Form form = Form.of(
Group.of(
Field.ofMultiSelectionType(strings, Collections.singletonList(1))
.label("Continent")
.render(new SimpleCheckBoxControl<>())
)
);
FormRenderer formRenderer = new FormRenderer(form);
formRenderer.setFillWidth(true);
root.getChildren().add(formRenderer);
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
} I write a simple demo look like above. then manually set width Form form = Form.of(
Group.of(
Field.ofMultiSelectionType(strings, Collections.singletonList(1))
.label("Continent")
.render(new SimpleCheckBoxControl<>() {
@Override
protected void setWidth(double value) {
super.setWidth(400);
}
})
)
); but not smart and accurate enough. Please Help. |
Is this project dead? I started using this library and after 5 minutes I hit this issue. No response since few months now. |
You just need to set the width of the FormRenderer; val model=PermissionModel();
val loginForm: Form = Form.of(
Group.of(
Field.ofStringType(model.userName)
.label("Username")
.span(12)
),
Group.of(
Field.ofStringType(model.password)
.label("Password")
.span(12)
.required("This field can’t be empty")
)
).title("Login")
val root = Pane()
var fr=FormRenderer(loginForm);
fr.prefWidth=600.0;
root.children.add(fr);
val stage=Stage();
stage.scene= Scene(root);
stage.title="add"
stage.centerOnScreen();
stage.show(); see com.dlsc.formsfx.view.controls.SimpleTextControl#layoutParts /**
* {@inheritDoc}
*/
@Override
public void layoutParts() {
super.layoutParts();
readOnlyLabel.getStyleClass().add("read-only-label");
readOnlyLabel.setPrefHeight(26);
editableArea.getStyleClass().add("simple-textarea");
editableArea.setPrefRowCount(5);
editableArea.setPrefHeight(80);
editableArea.setWrapText(true);
if (field.isMultiline()) {
stack.setPrefHeight(80);
readOnlyLabel.setPrefHeight(80);
}
stack.getChildren().addAll(editableField, editableArea, readOnlyLabel);
stack.setAlignment(Pos.CENTER_LEFT);
Node labelDescription = field.getLabelDescription();
Node valueDescription = field.getValueDescription();
int columns = field.getSpan();
if (columns < 3) {
int rowIndex = 0;
add(fieldLabel, 0, rowIndex++, columns, 1);
if (labelDescription != null) {
GridPane.setValignment(labelDescription, VPos.TOP);
add(labelDescription, 0, rowIndex++, columns, 1);
}
add(stack, 0, rowIndex++, columns, 1);
if (valueDescription != null) {
GridPane.setValignment(valueDescription, VPos.TOP);
add(valueDescription, 0, rowIndex, columns, 1);
}
} else {
add(fieldLabel, 0, 0, 2, 1);
if (labelDescription != null) {
GridPane.setValignment(labelDescription, VPos.TOP);
add(labelDescription, 0, 1, 2, 1);
}
add(stack, 2, 0, columns - 2, 1);
if (valueDescription != null) {
GridPane.setValignment(valueDescription, VPos.TOP);
add(valueDescription, 2, 1, columns - 2, 1);
}
}
} |
I just did a few hours of digging and found out that they use gridpanes for the layout. So basically they make 12 cols which have 100/12 % width of full width. For the label, they assigned 2 columns with cols span which means the label area is only having 16.67 % of the whole width which isn't enough. So I implemented a workaround that and I post it here. Hope it helps for ya all. /**
* Set label width by percentage
* @param pane probably the FormRenderer
* @param labelSize label size by percentage. For ex. if the label needs half the space of width use 50
*/
private void searchAndSetControlsLabelWidth(Pane pane, double labelSize) {
if(pane instanceof GridPane){
if(pane.getStyleClass().stream().anyMatch(s -> s.contains("simple-"))){
GridPane gp = (GridPane) pane;
if (gp.getColumnConstraints().size() == 12) {
double rest = 100 - labelSize;
for (int i = 0; i < gp.getColumnConstraints().size(); i++) {
if (i < 3) {
gp.getColumnConstraints().get(i).setPercentWidth(labelSize / 2);
}
else {
gp.getColumnConstraints().get(i).setPercentWidth(rest/10);
}
}
}
}
}
for (Node child : pane.getChildren()) {
if (child instanceof Pane) {
searchAndSetControlsLabelWidth((Pane) child, labelSize);
}
}
}
FormRenderer renderer = new FormRenderer(form);
searchAndSetControlsLabelWidth(renderer, 40); |
A correction would be hopeful... |
Here is a small improvement to @thamidu's solution - it accounts for sections in the forms: protected void searchAndSetControlsLabelWidth(Pane pane, double labelSize) {
if (pane instanceof GridPane) {
if (pane.getStyleClass().stream().anyMatch(s -> s.contains("simple-"))) {
GridPane gp = (GridPane) pane;
if (gp.getColumnConstraints().size() == 12) {
double rest = 100 - labelSize;
for (int i = 0; i < gp.getColumnConstraints().size(); i++) {
if (i < 3) {
gp.getColumnConstraints().get(i).setPercentWidth(labelSize / 2);
} else {
gp.getColumnConstraints().get(i).setPercentWidth(rest / 10);
}
}
}
}
}
for (Node child : pane.getChildren()) {
if (child instanceof Pane cpane) {
searchAndSetControlsLabelWidth(cpane, labelSize);
}
else if (child instanceof TitledPane tpane) {
if (tpane.getContent() instanceof Pane cpane) {
searchAndSetControlsLabelWidth(cpane, labelSize);
}
}
}
} |
Hi there,
Having difficulty setting the width of the Labels.. would be good to have room for a little more text.
Have been able to adjust the individual widths of the label and the control with CSS but this is creating an overlap as shown in image below. Any help would be much appreciated!
Many thanks
.changeLabel .label {
}
.changeLabel .combo-box-base{
-fx-max-width:150px;
}
The text was updated successfully, but these errors were encountered: