Верхнее выравнивание для FlowLayout - PullRequest
10 голосов
/ 30 апреля 2010

Я использую FlowLayout JPanel. Панель выглядит некрасиво, когда высота дочерних компонентов различна. Я ищу решение для их выравнивания по верху (аналогично valign="top" с ячейками таблицы в HTML).

Ответы [ 3 ]

14 голосов
/ 21 июля 2011

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

В любом случае, есть лучший ответ, начиная с JDK 1.6.Flowlayout имеет следующий метод:

public void setAlignOnBaseline(boolean alignOnBaseline)

Если вы используете этот метод для вашего flowlayout и установите для него значение true, то, когда flowlayout размещает компоненты, он будет проверять базовую линию каждого компонента и выравнивать компонент по этой базовой линии.

Но это еще не все, что вам нужно сделать.

Рассматриваемый компонент должен переопределить следующие два метода следующим образом:

@Override
public Component.BaselineResizeBehavior getBaselineResizeBehavior() {
    return Component.BaselineResizeBehavior.CONSTANT_ASCENT;
}

@Override
public int getBaseline(int width, int height) {
    return 0;
}

Это методы в JComponent икомпоновщики и менеджеры компоновки используют эти методы для определения компоновки компонента.

Если вы выполните шаги, упомянутые выше, все компоненты выровняются вдоль верхней части каждой строки.Конечно, если вы просто хотите использовать такой компонент, как JButton, вам, очевидно, придется расширить его, чтобы достичь желаемой цели ... но это не такая большая работа, как переопределение layoutcontainer с обходным решением, которое вы должны отлаживать.По крайней мере, я так думаю.

Удачи, -Асаф

1 голос
/ 30 апреля 2010

Вы должны быть в состоянии использовать BoxLayout. Поддерживает вертикальное выравнивание. Единственная проблема заключается в том, что вам необходимо вручную вставить компоненты горизонтальной распорки.

Или вы можете попробовать использовать Relative Layout . В вашем случае вы бы использовали:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS, 5);
rl.setBorderGap(5);
rl.setAlignment(RelativeLayout.LEADING);
JPanel panel = new JPanel( rl );
panel.add(...);
1 голос
/ 30 апреля 2010

Кто-то еще пожелал этого в форме сообщения об ошибке (в котором также указан обходной путь).

Посмотрите на

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4295966

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...