Подтвердить что ты не робот

Верхнее выравнивание для FlowLayout

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

4b9b3361

Ответ 1

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

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

public void setAlignOnBaseline(boolean alignOnBaseline)

Если вы используете этот метод в своем расписании и устанавливаете его в 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 с обходным решением, которое вы должны отлаживать. По крайней мере, я так думаю.

Удачи, -Asaf

Ответ 3

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

Или вы можете попробовать использовать Относительная компоновка. В вашем случае вы будете использовать:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS, 5);
rl.setBorderGap(5);
rl.setAlignment(RelativeLayout.LEADING);
JPanel panel = new JPanel( rl );
panel.add(...);