GridBagLayout, как я могу остановить растяжение экрана при размещении компонентов?

1

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

Вот фотография моей программы: Изображение 174551

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

Может ли кто-нибудь продемонстрировать, как маневрировать компонентами таким образом, чтобы он не растягивал экран? Редактирование моего кода работает, а также объяснение его словами, но я очень визуальный, и фрагменты кода работают лучше всего со мной.

благодаря

  • 0
    попробуйте vframe.setResizable(false);
  • 0
    Посмотрите на использование MigLayout в качестве гораздо лучшего макета для создания форм.
Показать ещё 4 комментария
Теги:
swing
gridbaglayout

2 ответа

3
Лучший ответ

Вы используете 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);
   }
}
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);
            }
        });
    }
}

Как мы можем ясно видеть, код намного короче.

Изображение 174551

  • 1
    Во-первых, вопрос об использовании GridBagLayout и не требует замены. Во-вторых, вы не указали стоимость зависимости от сторонней библиотеки. Наконец, было спорным, является ли строка менее подверженной ошибкам, чем явные GridBagConstraints.
  • 0
    1+, чтобы противостоять отрицательному голосованию. Ваше достойное решение, которое использует то, что я считаю более надежным, простым в использовании, более простым в улучшении менеджера компоновки.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню