Я использую GridBagLayout, и мне это нравится совсем немного, но у меня проблема с растяжением экрана, когда я размещаю и перемещаю свои компоненты. Я думаю, что это связано с моими вставками. Я использую вставки для перемещения и изменения размеров моих компонентов, которые, я собираюсь угадать, - это большой нет-нет в мире кодирования, но я не знаю, как это сделать по-другому. Я пытаюсь сделать форму, которую кто-то может заполнить, и я хочу, чтобы она выглядела аккуратно и аккуратно.
Вот фотография моей программы:
Поскольку вы можете видеть, что текстовое поле названия простирается намного дальше, чем все остальное, и это растяжение становилось все хуже, поскольку я использовал вставки для изменения своих JComboBoxes.
Вот мой код:
vframe = new JFrame("MES Banking App");
vpanel = new JPanel();
titlelabel = new JLabel("Verification Page");
namelabel = new JLabel("Name: ");
namefield = new JTextField(20);
birthdaylabel = new JLabel("Birth date: ");
dayDD = new JLabel("Day:");
daysArray = new String[] {"1","2","3","4","5","6","7","8","9", "10", "11", "12", "13", "14","15","16","17","18"};//31
BDday = new JComboBox(daysArray);
monthDD = new JLabel("Month:");
monthsArray = new String[] {"1","2","3","4","5","6","7","8","9","10","11","12"}; //12 months
BDmonth = new JComboBox(monthsArray);
//title section
vpanel.setLayout(new GridBagLayout());
grid = new GridBagConstraints();
grid.fill = GridBagConstraints.PAGE_START;
grid.weightx = 0;
grid.gridx = 0;
grid.gridy = 0;
vpanel.add(titlelabel,grid);
//name section
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 0;
grid.gridy = 1;
grid.insets = new Insets(10,0,0,0);
vpanel.add(namelabel,grid);//adds name label
grid.gridx = 1;
grid.gridy = 1;
grid.insets = new Insets(0,0,0,0);
vpanel.add(namefield,grid); //adds name text field
//birthday section
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 0;
grid.gridy = 2;
grid.insets = new Insets(0,0,0,0);
vpanel.add(birthdaylabel,grid); //adds bday label
grid.gridx = 1;
grid.gridy = 2;
vpanel.add(dayDD,grid); //add day label
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 1;
grid.gridy = 2;
grid.insets = new Insets(0,30,0,350);//sets day drop down
vpanel.add(BDday,grid);
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 1;
grid.gridy = 2;
grid.insets = new Insets(0,100,0,250);//month label
vpanel.add(monthDD,grid);
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 1;
grid.gridy = 2;
grid.insets = new Insets(0,150,0,250);
vpanel.add(BDmonth,grid);
vframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
vframe.getContentPane().add(vpanel);
vframe.pack();
vframe.setVisible(true);
Может ли кто-нибудь продемонстрировать, как маневрировать компонентами таким образом, чтобы он не растягивал экран? Редактирование моего кода работает, а также объяснение его словами, но я очень визуальный, и фрагменты кода работают лучше всего со мной.
благодаря
Вы используете GridBagLayout и особенно GridBagConstraints неправильно, поскольку вы ставите компоненты прямо друг над другом. Вам нужно убедиться, что вы не даете одному компоненту ту же самую сетку и сетчатую позицию. Используйте GridWidth для растягивания компонентов, но снова установите его для следующего компонента. Не используйте вставки для этой цели. Обратите внимание, что часто лучше использовать новые GridBagConstraints для каждого компонента. Я часто создаю метод создания GridBagConstraints только для этой цели.
например,
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.*;
public class LayoutFoo2 {
private static JFrame vframe;
private static JPanel vpanel;
private static JLabel titlelabel;
private static JLabel namelabel;
private static JTextField namefield;
private static JLabel birthdaylabel;
private static JLabel dayDD;
private static String[] daysArray;
private static JComboBox BDday;
private static JLabel monthDD;
private static String[] monthsArray;
private static JComboBox BDmonth;
private static GridBagConstraints grid;
public static void main(String[] args) {
vframe = new JFrame("MES Banking App");
vpanel = new JPanel();
titlelabel = new JLabel("Verification Page");
namelabel = new JLabel("Name: ");
namefield = new JTextField(20);
birthdaylabel = new JLabel("Birth date: ");
dayDD = new JLabel("Day:");
daysArray = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "11", "12", "13", "14", "15", "16", "17", "18" };// 31
BDday = new JComboBox(daysArray);
monthDD = new JLabel("Month:");
monthsArray = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "11", "12" }; // 12 months
BDmonth = new JComboBox(monthsArray);
// title section
vpanel.setLayout(new GridBagLayout());
grid = new GridBagConstraints();
grid.fill = GridBagConstraints.CENTER;
grid.insets = new Insets(5, 5, 5, 5);
grid.weightx = 1.0;
grid.weighty = 1.0;
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 0;
grid.gridy = 0;
grid.gridwidth = 5;
grid.gridheight = 1;
vpanel.add(titlelabel, grid);
// name section
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridwidth = 1;
grid.gridx = 0;
grid.gridy = 1;
vpanel.add(namelabel, grid);// adds name label
grid.gridx = 1;
grid.gridy = 1;
grid.gridwidth = 4;
vpanel.add(namefield, grid); // adds name text field
// birthday section
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 0;
grid.gridy = 2;
grid.gridwidth = 1;
vpanel.add(birthdaylabel, grid); // adds bday label
grid.gridx = 1;
grid.gridy = 2;
vpanel.add(dayDD, grid); // add day label
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 2;
grid.gridy = 2;
//!! grid.insets = new Insets(0, 30, 0, 350);// sets day drop down
vpanel.add(BDday, grid);
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 3;
grid.gridy = 2;
//!! grid.insets = new Insets(0, 100, 0, 250);// month label
vpanel.add(monthDD, grid);
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridx = 4;
grid.gridy = 2;
//!! grid.insets = new Insets(0, 150, 0, 250);
vpanel.add(BDmonth, grid);
vframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
vframe.getContentPane().add(vpanel);
vframe.pack();
vframe.setVisible(true);
}
}
Поэтому, используя два метода для упрощения:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.*;
@SuppressWarnings("serial")
public class LayoutFoo2 extends JPanel {
private static final Insets DEFAULT_INSETS = new Insets(5, 5, 5, 5);
private static final double DEFAULT_WEIGHTX = 1.0;
private static final double DEFAULT_WEIGHTY = 1.0;
private static JFrame vframe;
private static JPanel vpanel;
private static JLabel titlelabel;
private static JLabel namelabel;
private static JTextField namefield;
private static JLabel birthdaylabel;
private static JLabel dayDD;
private static String[] daysArray;
private static JComboBox BDday;
private static JLabel monthDD;
private static String[] monthsArray;
private static JComboBox BDmonth;
private static GridBagConstraints grid;
public static void main(String[] args) {
vframe = new JFrame("MES Banking App");
vpanel = new JPanel();
titlelabel = new JLabel("Verification Page");
namelabel = new JLabel("Name: ");
namefield = new JTextField(20);
birthdaylabel = new JLabel("Birth date: ");
dayDD = new JLabel("Day:");
daysArray = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "11", "12", "13", "14", "15", "16", "17", "18" };// 31
BDday = new JComboBox(daysArray);
monthDD = new JLabel("Month:");
monthsArray = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "11", "12" }; // 12 months
BDmonth = new JComboBox(monthsArray);
// title section
vpanel.setLayout(new GridBagLayout());
grid = createGbc(0, 0, 5, 1);
grid.fill = GridBagConstraints.CENTER;
titlelabel.setHorizontalTextPosition(JLabel.CENTER);
vpanel.add(titlelabel, grid);
// name section
grid = createGbc(0, 1);
vpanel.add(namelabel, grid);// adds name label
grid = createGbc(1, 1, 4, 1);
vpanel.add(namefield, grid); // adds name text field
// birthday section
grid = createGbc(0, 2);
vpanel.add(birthdaylabel, grid); // adds bday label
grid = createGbc(1, 2);
vpanel.add(dayDD, grid); // add day label
grid = createGbc(2, 2);
vpanel.add(BDday, grid);
grid = createGbc(3, 2);
vpanel.add(monthDD, grid);
grid = createGbc(4, 2);
vpanel.add(BDmonth, grid);
vframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
vframe.getContentPane().add(vpanel);
vframe.pack();
vframe.setVisible(true);
}
public static GridBagConstraints createGbc(int x, int y, int width, int height) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = height;
// default set ups
gbc.insets = DEFAULT_INSETS;
gbc.weightx = DEFAULT_WEIGHTX;
gbc.weighty = DEFAULT_WEIGHTY;
gbc.fill = GridBagConstraints.HORIZONTAL;
return gbc;
}
public static GridBagConstraints createGbc(int x, int y) {
return createGbc(x, y, 1, 1);
}
}
GridBagLayout
воздушной подушке был быстрее, мое решение GridBagLayout
только очищает пример от нескольких двуличий:
package com.zetcode;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class GridBagBankingApp extends JFrame {
public GridBagBankingApp() {
initUI();
setTitle("MES Banking App");
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void initUI() {
JLabel titlelabel = new JLabel("Verification Page");
JLabel namelabel = new JLabel("Name: ");
JTextField namefield = new JTextField(10);
JLabel birthdaylabel = new JLabel("Birth date: ");
JLabel dayDD = new JLabel("Day:");
String[] daysArray = new String[]{"1", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "11", "12", "13", "14", "15",
"16", "17", "18"};// 31
JComboBox BDday = new JComboBox(daysArray);
JLabel monthDD = new JLabel("Month:");
String[] monthsArray = new String[]{"1", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "11", "12"}; // 12 months
JComboBox BDmonth = new JComboBox(monthsArray);
//title section
setLayout(new GridBagLayout());
GridBagConstraints grid = new GridBagConstraints();
grid.fill = GridBagConstraints.CENTER;
grid.insets = new Insets(5, 5, 5, 5);
grid.gridwidth = 5;
add(titlelabel, grid);
//name section
grid.fill = GridBagConstraints.HORIZONTAL;
grid.gridwidth = 1;
grid.gridy = 1;
add(namelabel, grid);
grid.gridx = 1;
grid.gridwidth = 4;
add(namefield, grid);
//birthday section
grid.gridx = 0;
grid.gridy = 2;
grid.gridwidth = 1;
add(birthdaylabel, grid);
grid.gridx = 1;
add(dayDD, grid);
grid.gridx = 2;
add(BDday, grid);
grid.gridx = 3;
add(monthDD, grid);
grid.gridx = 4;
add(BDmonth, grid);
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GridBagBankingApp ex = new GridBagBankingApp();
ex.setVisible(true);
}
});
}
}
Вместо GridBagLayout
используйте менеджер MigLayout
. В отличие от MigLayout
, который создает целую сетку одним выстрелом, в GridBagLayout
мы должны определять каждую ячейку индивидуально. Это утомительно и подвержено ошибкам.
MigLayout
гораздо более портативен. В GridBagLayout's
мы определили вставки следующим образом:
grid.insets = new Insets(5, 5, 5, 5);
Это может быть нормально при определенном разрешении. На других это неверно. (Это может быть слишком маленьким и разрушить весь наш макет.) MigLayout
создает промежутки между компонентами, которые имеют разрешение экрана и независимый от DPI. По этой причине нам следует избегать использования GridBagLayout
и использовать менеджеров MigLayout
или GroupLayout
.
package com.zetcode;
import java.awt.EventQueue;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
public class MigLayoutBankingApp extends JFrame {
public MigLayoutBankingApp() {
initUI();
setTitle("MES Banking App");
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void initUI() {
JPanel pnl = new JPanel(new MigLayout());
JLabel titleLbl = new JLabel("Verification Page");
JLabel nameLbl = new JLabel("Name: ");
JTextField nameField = new JTextField(10);
JLabel bdLbl = new JLabel("Birth date: ");
JLabel dayDD = new JLabel("Day:");
String[] daysArray = new String[]{"1", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "11", "12", "13", "14", "15",
"16", "17", "18" };
JComboBox BDday = new JComboBox(daysArray);
JLabel monthDD = new JLabel("Month:");
String[] monthsArray = new String[]{"1", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "11", "12"}; // 12 months
JComboBox BDmonth = new JComboBox(monthsArray);
pnl.add(titleLbl, "spanx, center, wrap");
pnl.add(nameLbl);
pnl.add(nameField, "spanx, growx, wrap");
pnl.add(bdLbl);
pnl.add(dayDD);
pnl.add(BDday);
pnl.add(monthDD);
pnl.add(BDmonth);
add(pnl);
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MigLayoutBankingApp ex = new MigLayoutBankingApp();
ex.setVisible(true);
}
});
}
}
Как мы можем ясно видеть, код намного короче.
vframe.setResizable(false);