Вообще говоря, вам следует избегать абсолютного позиционирования.Если вам do необходимо явно указать координаты пикселей для объектов, предпочтите менеджер макетов, например GridBagLayout
, который, по крайней мере, дает вам прямой контроль над размером сетки и интервалом.
Для ваших целей, я думаю, что имеет смысл построить сетку 9x9 по 50 пикселей каждый, а затем указать каждый из ваших объектов, чтобы они заняли несколько из этих блоков каждый.
Итак, в вашем initGUI
метод, мы сначала установим макет:
GridBagLayout layout;
public void initGUI() {
/*...*/
con.setLayout(layout = new GridBagLayout());
layout.columnWidths = new int[9];
Arrays.fill(layout.columnWidths, 50);
layout.rowHeights = new int[9];
Arrays.fill(layout.rowHeights, 50);
Затем, после этого, мы определим ограничения для каждого из объектов, отображаемых в вашем приложении.Это немного многословно, но во многом это стандартный код.
//Label will be 150 (50*3) pixels wide, start at 0,0, and we'll add 30 pixels of padding below it.
GridBagConstraints firstOperandConstraints = new GridBagConstraints(
0,0,
3,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 30, 0),
0, 0
);
//Text field will be 150 (50*3) pixels wide, start at 200(50*4),0, and have 30 pixels of padding below it
GridBagConstraints op1Constraints = new GridBagConstraints(
4,0,
3,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 30, 0),
0, 0
);
//Label will be 150 (50*3) pixels wide, start at 0,200 (50*4), and we'll add 30 pixels of padding below it.
GridBagConstraints secondOperandConstraints = new GridBagConstraints(
0,4,
3,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 30, 0),
0, 0
);
//Field will be 150 (50*3) pixels wide, start at 200,200 (50*4), and we'll add 30 pixels of padding below it.
GridBagConstraints op2Constraints = new GridBagConstraints(
4,4,
3,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 30, 0),
0, 0
);
//Label will be 150 (50*3) pixels wide, start at 0,300 (50*6), and we'll add 30 pixels of padding below it.
GridBagConstraints answerConstraints = new GridBagConstraints(
0,6,
3,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 30, 0),
0, 0
);
//Label will be 150 (50*3) pixels wide, start at 300,300 (50*6), and we'll add 30 pixels of padding below it.
GridBagConstraints ansConstraints = new GridBagConstraints(
6,6,
3,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 30, 0),
0, 0
);
//Button will be 50 pixels wide/tall, start at 0,400 (50*8), and it won't have any padding
GridBagConstraints plusConstraints = new GridBagConstraints(
0,8,
1,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0),
0, 0
);
//Button will be 50 pixels wide/tall, start at 200,400 (50*4/50*8), and it won't have any padding
GridBagConstraints mulConstraints = new GridBagConstraints(
4,8,
1,1,
1,1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0),
0, 0
);
Затем мы добавим каждое из этих ограничений при добавлении кнопок / меток / полей:
con.add(firstOperand, firstOperandConstraints);
con.add(op1, op1Constraints);
con.add(secondOperand, secondOperandConstraints);
con.add(op2, op2Constraints);
con.add(answer, answerConstraints);
con.add(ans, ansConstraints);
con.add(plus, plusConstraints);
con.add(mul, mulConstraints);
И, наконец, мы сделаем фрейм неизменяемым, чтобы гарантировать, что все не движется:
frame.pack();
frame.setResizable(false);
В результате получается приложение, которое выглядит следующим образом:
С добавлением линий сетки (вручную, поэтому они немного неровные), мы можем увидеть, как он разделил экран:
В зависимости от ваших требований, вам может понадобиться «украсить» это приложение, перемещая компоненты или изменяя размеры.Несколько вещей для рассмотрения:
- Вы можете получить любое произвольное позиционирование, которое вам нужно, комбинируя положения сетки и вставки.Ящик, занимающий
[230,170]-[290,320]
, может быть легко представлен, если начать объект с позиции 4,3, присвоив ему значения ширины / высоты 2,4 и указав Вставки (20, 30, 30, 10)
. - Если вы хотитеЧтобы изменить размер рамки без изменения положения / размеров компонентов, вам необходимо объединить их в их собственную панель и добавить эту панель в корневую панель содержимого.
Ниже приведен пример, который позволяетразмер самой рамки должен быть изменен без перемещения кнопок / полей / надписей или слишком маленького размера для отображения этих компонентов:
JPanel panel = new JPanel();
panel.setLayout(layout = new GridBagLayout());
layout.columnWidths = new int[9];
Arrays.fill(layout.columnWidths, 50);
layout.rowHeights = new int[9];
Arrays.fill(layout.rowHeights, 50);
panel.add(firstOperand, firstOperandConstraints);
panel.add(op1, op1Constraints);
panel.add(secondOperand, secondOperandConstraints);
panel.add(op2, op2Constraints);
panel.add(answer, answerConstraints);
panel.add(ans, ansConstraints);
panel.add(plus, plusConstraints);
panel.add(mul, mulConstraints);
GridBagLayout rootLayout = new GridBagLayout();
rootLayout.columnWidths = new int[]{450};
rootLayout.rowHeights = new int[]{450};
con.setLayout(rootLayout);
con.add(panel, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(null); //To make sure the pack() directive doesn't result in a frame larger than the components
frame.pack();
frame.setMinimumSize(frame.getSize());
frame.setVisible(true);