2017-01-09 11 views
2

Кнопка всегда может автоматически изменять размер своей ширины до ее содержимого (textProperty), но мне нужно что-то еще.JavaFX: Кнопки с одинаковой шириной и размером с текстом

У меня есть группа кнопок; каждый имеет свой собственный текст. Мне нужно, чтобы все кнопки имели одинаковую ширину, но в то же время я хочу, чтобы эта же ширина была как можно меньше (так, чтобы ни одна из кнопок не имела дополнительных пространств или многоточия).

Я думал, что это будет легко, пока я не понял, что getWidth(), getlayoutBounds.getWidth() и getlayoutBoundsInParent().getWidth() не возвращают расчетную ширину.

Изначально я был непосредственно связывающий все свойства (prefWidthProprety() в widthProperty() и т.д.), но в конце концов я упала в ручной режим для исследования:

Button buttonA; // With original text "hello world" 

buttonA.setText("Testing new String. This is very long so the width will be very big."); 
buttonA.layout(); 
buttonA.requestLayout(); 

Platform.runLater(() -> 
{ 
    System.out.println(buttonA.getWidth()); // Gives me old value 
    System.out.println(buttonA.getlayoutBounds.getWidth()); // Gives me old value 
    System.out.println(buttonA.getlayoutBoundsInParent().getWidth()); // Gives me old value 
}); 

Итак, какие варианты у меня есть?

+0

Вы пытались поместить всю кнопку на VBOX? Установите ширину VBOX в USE_COMPUTED_SIZE и привяжите свойства ширины кнопок к свойству ширины vbox – Zoltanik

+2

Делает ли * nobody * больше читать документацию? В качестве примера можно привести стандартный Oracle [макет учебника] (http://docs.oracle.com/javase/8/javafx/layout-tutorial/size_align.htm#JFXLY133). В нем говорится: * «Вы можете решить проблему определения высоты и ширины каждой кнопки, а затем установить предпочтительный размер каждой кнопки на максимальную высоту и ширину кнопок в наборе. Более простой вариант - позволить макету panes выполните работу. "*, а затем продолжим рассказывать, как решить * именно эту проблему без вычислительных размеров (* или *, @Zoltanik, используя привязки). –

ответ

1

Чтобы ответить вам вопрос относительно Оформление печатных изданий:

Вы можете запросить раскладку на родителя из Button как:

buttonA.setText("Testing new String. This is very long so the width will be very big."); 
buttonA.getParent().layout(); 
buttonA.getParent().applyCss(); 

Я добавил applyCss и удалены requestLayout:

При необходимости применяйте стили к этому узлу и его дочерним элементам, если они есть. Этот метод обычно не нужно вызывать напрямую, но может использоваться в сочетании с Parent.layout() для размера узла перед следующим импульсом или если сцена не находится в рабочей области.

+0

Хорошо, это работает ... 'applyCss()' не является решающей частью, он вызывает 'layout()' родителя, который выполняет эту работу. – Jai

+0

В случае неподтвержденного 'Button' вы правы, но если вы установите для них некоторый CSS, он станет «решающим» :) – DVarga

+0

Хотя это не способ сделать кнопки той же ширины в первую очередь. Просто позвольте 'VBox' (или любой другой панели, которую вы используете) выполняет эту работу для вас. –