Вы не можете сделать серьезные макеты GridLayout
или лозы BoxLayout
. Забудьте о них.
Первый вопрос: вы уверены, что не хотите, чтобы JTextArea
и JTextField
расти? Стандарт в пользовательском интерфейсе состоит в том, что эти компоненты растут и сокращаются; первый в обоих направлениях, второй - по горизонтали.
В любом случае, я размещаю решения для GroupLayout
и MigLayout
, которые являются менеджерами, которых я очень рекомендую.
а) Решение с GroupLayout
Каждый компонент имеет три размера: минимальный, предпочтительный и максимум. Эти установлены на некоторые разумные значения по умолчанию для каждого компонента. Вот почему JTextField
имеет тенденцию расти горизонтально; его максимальное значение установлено на очень большое количество.
package com.zetcode;
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class GroupLayoutStretchingEx extends JFrame {
public GroupLayoutStretchingEx() {
initUI();
}
private void initUI() {
JTextArea area = new JTextArea(12, 20);
area.setBorder(BorderFactory.createEtchedBorder());
JLabel input = new JLabel("Input");
JTextField textField = new JTextField(15);
createLayout(area, input, textField);
setTitle("Stretching");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void createLayout(JComponent... arg) {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
gl.setAutoCreateGaps(true);
gl.setHorizontalGroup(gl.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addComponent(arg[0], GroupLayout.DEFAULT_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGroup(gl.createSequentialGroup()
.addComponent(arg[1])
.addComponent(arg[2], GroupLayout.DEFAULT_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
);
gl.setVerticalGroup(gl.createSequentialGroup()
.addComponent(arg[0], GroupLayout.DEFAULT_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGroup(gl.createParallelGroup()
.addComponent(arg[1])
.addComponent(arg[2], GroupLayout.DEFAULT_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
);
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
GroupLayoutStretchingEx ex = new GroupLayoutStretchingEx();
ex.setVisible(true);
});
}
}
В GroupLayout
, вам необходимо установить правильные значения для максимального компонента размера в методе addComponent()
.
JTextArea area = new JTextArea(12, 20);
Установив количество строк и столбцов для JTextArea
, мы установить желаемый размер для этого компонента. Это значение позже используется менеджером макета в его расчетах.
б) Решение с MigLayout
В MigLayout
, мы контролируем resizement компонентов с различными ограничений, таких, как fill
, grow
или push
. Не используя их, компоненты не растут.
package com.zetcode;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;
public class MigLayoutStretchingEx extends JFrame {
public MigLayoutStretchingEx() {
initUI();
}
private void initUI() {
JTextArea area = new JTextArea(12, 20);
area.setBorder(BorderFactory.createEtchedBorder());
JLabel input = new JLabel("Input");
JTextField textField = new JTextField(15);
createLayout(area, input, textField);
setTitle("MigLayout example");
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void createLayout(JComponent... arg) {
setLayout(new MigLayout());
add(arg[0], "wrap");
add(arg[1], "split 2");
add(arg[2], "growx");
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
MigLayoutStretchingEx ex = new MigLayoutStretchingEx();
ex.setVisible(true);
});
}
}
А вот скриншот:
Пожалуйста, пост некоторые кусок кода, чтобы исследовать этот вопрос. – Braj
Начнем с рассмотрения [Выравнивание компонентов внутри контейнера] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) для получения более подробной информации о различных менеджерах компоновки, что-то вроде 'FlowLayout' и' GridBagLayout' выполнили бы работу – MadProgrammer
Предоставьте ASCII-проект или простой чертеж * предназначенного макета GUI с минимальным размером и, если он изменен, с большей шириной и высотой. –