Я написал базовый элемент управления и его кожу. A label
отображается в HBox
на коже. Этот ярлык должен обернуть его текст, если места недостаточно.
public class LabelWrap extends Application {
public static void main(String[] args) {
launch(LabelWrap.class);
}
@Override
public void start(Stage stage) throws Exception {
BasicControl basicControl = new BasicControl();
BorderPane borderPane = new BorderPane();
borderPane.setPrefWidth(150);
borderPane.setCenter(basicControl);
stage.setScene(new Scene(borderPane));
stage.centerOnScreen();
stage.show();
}
private static class BasicControl extends Control {
@Override
protected Skin<?> createDefaultSkin() {
return new BasicControlSkin(this);
}
}
private static class BasicControlSkin extends SkinBase<BasicControl> {
protected BasicControlSkin(BasicControl control) {
super(control);
VBox box = new VBox();
Label label = new Label("This text should wrap because it is too long");
label.setWrapText(true);
box.getChildren().add(label);
getChildren().add(box);
}
}
}
Но метка не обертывается (отображается многоточие), потому что предпочтительная ширина моего элемента управления неправильно вычисляется:
что я хочу получить:
Как настроить скин, чтобы вычислить предпочтительную высоту скина, чтобы получить желаемое поведение (я никогда не хочу показывать эллипсис)?
Примечания:
- Я не хочу устанавливать явный максимальный размер на ярлыке или на других компонентах скина:
label.setMaxWidth(150)
. Единственным явным набором ширины должен быть кореньBorderPane
вstart method
. Эта ширина (150) может быть переменной, элемент управления может использоваться в разных местах. - Этот базовый элемент управления, конечно, является упрощением реального. Реальный показывает несколько
label
с переменными текстами внутри. - ярлык обертывается правильно, если я увеличиваю высоту окна, пока не будет достаточно места.
- этот код работает на java 1.8.0_40-b27 на OSX 10.10.2