Java 更改JLabel时GridBagLayout会更改

Java 更改JLabel时GridBagLayout会更改,java,swing,resize,layout-manager,gridbaglayout,Java,Swing,Resize,Layout Manager,Gridbaglayout,我想制作一个输入表单,并在焦点丢失时对输入字段进行验证。如果验证失败,我想在InputField旁边显示一条错误消息 我的问题:当我更改输入字段旁边错误JLabel的文本时,输入字段及其下划线将调整大小 复制步骤: 运行主方法 在输入字段中输入10个以上的字符 -->当前结果:文本字段和分隔符调整大小,错误JLabel显示在最右侧 -->想要的结果:文本字段和分隔符保持不变,错误JLabel显示在与测试消息相同的位置 我已经为一个小问题挣扎了好几天了。请帮忙 package View; imp

我想制作一个输入表单,并在焦点丢失时对输入字段进行验证。如果验证失败,我想在InputField旁边显示一条错误消息

我的问题:当我更改输入字段旁边错误JLabel的文本时,输入字段及其下划线将调整大小

复制步骤:

  • 运行主方法
  • 在输入字段中输入10个以上的字符
  • -->当前结果:文本字段和分隔符调整大小,错误JLabel显示在最右侧

    -->想要的结果:文本字段和分隔符保持不变,错误JLabel显示在与测试消息相同的位置

    我已经为一个小问题挣扎了好几天了。请帮忙

    package View;
    
    import javafx.scene.input.KeyCode;
    
    import javax.swing.*;
    import javax.swing.border.Border;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;
    import java.awt.*;
    import java.awt.event.*;
    
    public class PersonDataInput extends JPanel {
    
        private JLabel emailLabel;
        private JLabel mobileLabel;
        private JLabel nameLabel;
        private JLabel phoneLabel;
        private JLabel surnameLabel;
    
        private JLabel emailErrorLabel;
        private JLabel mobileErrorLabel;
        private JLabel nameErrorLabel;
        private JLabel phoneErrorLabel;
        private JLabel surnameErrorLabel;
    
        private JTextField mobileInputField;
        private JTextField nameInputField;
        private JTextField phoneInputField;
        private JTextField surnameInputField;
        private JTextField emailInputField;
    
        public static void main(String[] args) {
    
            JFrame frame = new JFrame("Test");
            frame.setContentPane(new PersonDataInput());
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    
        public PersonDataInput() {
            Border redline = BorderFactory.createLineBorder(Color.red);
            setBorder(redline);
            //setMaximumSize(new Dimension(200,300));
            initComponents();
        }
    
        private void initComponents() {
    
    
            // <editor-fold defaultstate="collapsed" desc="Components">
            emailLabel = new JLabel("Email");
            mobileLabel = new JLabel("Mobile");
            nameLabel = new JLabel("Name");
            phoneLabel = new JLabel("Phone");
            surnameLabel = new JLabel("Surname");
    
            emailErrorLabel = new JLabel();
            mobileErrorLabel = new JLabel();
            nameErrorLabel = new JLabel();
            phoneErrorLabel = new JLabel();
            surnameErrorLabel = new JLabel();
    
            mobileInputField = new JTextField();
            nameInputField = new JTextField();
            phoneInputField = new JTextField();
            surnameInputField = new JTextField();
            emailInputField = new JTextField();
    
            mobileInputField.setDocument(new JTextFieldLimit(10));
            nameInputField.setDocument(new JTextFieldLimit(10));
            phoneInputField.setDocument(new JTextFieldLimit(10));
            surnameInputField.setDocument(new JTextFieldLimit(10));
            emailInputField.setDocument(new JTextFieldLimit(10));
    
            mobileInputField.setName("mobileInputField");
            nameInputField.setName("nameInputField");
            phoneInputField.setName("phoneInputField");
            surnameInputField.setName("surnameInputField");
            emailInputField.setName("emailInputField");
    
            JSeparator seperator1 = new JSeparator();
            JSeparator seperator2 = new JSeparator();
            JSeparator seperator3 = new JSeparator();
            JSeparator seperator4 = new JSeparator();
            JSeparator seperator5 = new JSeparator();
            // </editor-fold>
    
            // <editor-fold defaultstate="collapsed" desc="EventListeners">
    
            //...
            //...
            KeyListener keyListener = new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent keyEvent) {
                    //...
                }
    
                @Override
                public void keyPressed(KeyEvent keyEvent) {
                    keyPressedMethod(keyEvent);
                }
    
                @Override
                public void keyReleased(KeyEvent keyEvent) {
                    //...
                }
            };
    
            //...
            FocusListener focusListener = new FocusAdapter() {
                @Override
                public void focusGained(FocusEvent focusEvent) {
                    focusGainedMethod(focusEvent);
                }
    
                @Override
                public void focusLost(FocusEvent focusEvent) {
                    focusLostMethod(focusEvent);
                }
            };
    
            mobileInputField.addFocusListener(focusListener);
            mobileInputField.addKeyListener(keyListener);
    
            nameInputField.addFocusListener(focusListener);
            nameInputField.addKeyListener(keyListener);
    
            phoneInputField.addFocusListener(focusListener);
            phoneInputField.addKeyListener(keyListener);
    
            surnameInputField.addFocusListener(focusListener);
            surnameInputField.addKeyListener(keyListener);
    
            emailInputField.addFocusListener(focusListener);
            emailInputField.addKeyListener(keyListener);
            // </editor-fold>s
    
            // <editor-fold defaultstate="collapsed" desc="Styles">
            mobileInputField.setBorder(null);
            nameInputField.setBorder(null);
            phoneInputField.setBorder(null);
            surnameInputField.setBorder(null);
            emailInputField.setBorder(null);
            setBackground(new java.awt.Color(255, 255, 255));
            //</editor-fold>
    
            // <editor-fold defaultstate="collapsed" desc="Layout">
            GridBagLayout gridBagLayout = new GridBagLayout();
            setLayout(gridBagLayout);
    
    
            // this component is needed to anchor all components within the JPanel to the upper right corner
            GridBagConstraints horizontalFill = new GridBagConstraints();
            horizontalFill.anchor = GridBagConstraints.NORTHWEST;
            horizontalFill.fill = GridBagConstraints.HORIZONTAL;
            horizontalFill.gridwidth=4;
            horizontalFill.weightx = 1;
            add(Box.createHorizontalGlue(), horizontalFill);
    
            add(nameLabel,
                    new GBC(0, 0)
                            .setSpan(1,1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(nameInputField,
                    new GBC(0, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setIpad(100,0)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            nameErrorLabel.setText("Test: The error message shall be displayed here.");
            add(nameErrorLabel,
                    new GBC(1, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setIpad(200,0)
                            .setAnchor(GBC.NORTHWEST)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(seperator1,
                    new GBC(0, 2)
                            .setFill(GBC.HORIZONTAL)
                            .setIpad(100,0)
                            .setInsets(5,10,0,0)
                            .setWeight(0.0, 1.0));
    /*
            add(surnameLabel,
                    new GBC(0, 3)
                            .setSpan(1,1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(surnameInputField,
                    new GBC(0, 4)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setIpad(100,0)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(seperator2,
                    new GBC(0, 5)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(emailLabel,
                    new GBC(0, 6)
                            .setSpan(1,1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(emailInputField,
                    new GBC(0, 7)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setIpad(100,0)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(seperator3,
                    new GBC(0, 8)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(phoneLabel,
                    new GBC(0, 9)
                            .setSpan(1,1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(phoneInputField,
                    new GBC(0, 10)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setIpad(100,0)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(seperator4,
                    new GBC(0, 11)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(mobileLabel,
                    new GBC(0, 12)
                            .setSpan(1,1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(mobileInputField,
                    new GBC(0, 13)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setIpad(100,0)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
            add(seperator5,
                    new GBC(0, 14)
                            .setSpan(2, 1)
                            .setFill(GBC.HORIZONTAL)
                            .setInsets(5,10,0,0)
                            .setWeight(0, 1.0));
    
     */
    
    
    
    
        }// </editor-fold>
            //</editor-fold>
    
    
    
        private void keyPressedMethod(KeyEvent keyEvent) {
            String component = keyEvent.getComponent().getName();
    
            if (keyEvent.getKeyCode() == KeyEvent.VK_ENTER) {
                switch (component) {
                    case "nameInputField":
                        surnameInputField.requestFocus();
                        break;
                    case "surnameInputField":
                        emailInputField.requestFocus();
                        break;
                    case "emailInputField":
                        phoneInputField.requestFocus();
                        break;
                    case "phoneInputField":
                        mobileInputField.requestFocus();
                        break;
                    case "mobileInputField":
                        this.requestFocus();
                    default:
                        break;
                }
    
            }
    
            // todo: field validation anpassen, Email Validation,
            else {
                switch (component) {
                    case "nameInputField":
                        if (nameInputField.getText().length() == 10) {
                            nameErrorLabel.setText("Max. 10 characters.");
                        }
                        break;
                    case "surnameInputField":
                        if (surnameInputField.getText().length() == 10) {
                            surnameErrorLabel.setText("Max. 10 characters.");
                        }
                        break;
                    case "emailInputField":
                        if (emailInputField.getText().length() == 10) {
                            emailErrorLabel.setText("Max. 10 characters.");
                        }
                        break;
                    case "phoneInputField":
                        if (phoneInputField.getText().length() == 10) {
                            phoneErrorLabel.setText("Max. 10 characters.");
                        }
                        break;
                    case "mobileInputField":
                        if (mobileInputField.getText().length() == 10) {
                            mobileErrorLabel.setText("Max. 10 characters.");
                        }
                    default:
                        break;
                }
    
            }
        }
    
        private void focusLostMethod(FocusEvent focusEvent) {
            String component = focusEvent.getComponent().getName();
            switch (component) {
                case "nameInputField":
                    nameLabel.setForeground(Color.black);
                    nameErrorLabel.setText("");
                    break;
                case "surnameInputField":
                    surnameLabel.setForeground(Color.black);
                    break;
                case "emailInputField":
                    emailLabel.setForeground(Color.black);
                    break;
                case "phoneInputField":
                    phoneLabel.setForeground(Color.black);
                    break;
                case "mobileInputField":
                    mobileLabel.setForeground(Color.black);
                default:
                    break;
            }
        }
    
        private void focusGainedMethod(FocusEvent focusEvent) {
            String component = focusEvent.getComponent().getName();
            switch (component) {
                case "nameInputField":
                    nameLabel.setForeground(new Color(51, 102, 255));
                    break;
                case "surnameInputField":
                    surnameLabel.setForeground(new Color(51, 102, 255));
                    break;
                case "emailInputField":
                    emailLabel.setForeground(new Color(51, 102, 255));
                    break;
                case "phoneInputField":
                    phoneLabel.setForeground(new Color(51, 102, 255));
                    break;
                case "mobileInputField":
                    mobileLabel.setForeground(new Color(51, 102, 255));
                default:
                    break;
            }
        }
    
    
        //Class to set limits for JTextFields
        class JTextFieldLimit extends PlainDocument {
            private int limit;
    
            JTextFieldLimit(int limit) {
                super();
                this.limit = limit;
            }
    
            JTextFieldLimit(int limit, boolean upper) {
                super();
                this.limit = limit;
            }
    
            public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
                if (str == null)
                    return;
    
                if ((getLength() + str.length()) <= limit) {
                    super.insertString(offset, str, attr);
                }
            }
        }
    
    }
    
    
    
    包视图;
    导入javafx.scene.input.KeyCode;
    导入javax.swing.*;
    导入javax.swing.border.border;
    导入javax.swing.text.AttributeSet;
    导入javax.swing.text.BadLocationException;
    导入javax.swing.text.PlainDocument;
    导入java.awt.*;
    导入java.awt.event.*;
    公共类PersonDataInput扩展了JPanel{
    私人JLabel电子标签;
    私人JLabel mobileLabel;
    私人JLabel标签;
    私人JLabel电话标签;
    私人JLabel姓氏标签;
    私人JLabel电子邮件错误标签;
    私人JLabel移动标签;
    私人JLabel名称错误标签;
    私人JLabel电话错误标签;
    私人JLabel标签;
    私有JTextField mobileInputField;
    私有JTextField nameInputField;
    私有JTextField电话输入字段;
    私有JTextField姓氏inputfield;
    私有JTextField emailInputField;
    公共静态void main(字符串[]args){
    JFrame=新JFrame(“测试”);
    setContentPane(新的PersonDataInput());
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
    }
    公共人员数据输入(){
    边框红线=BorderFactory.createLineBorder(Color.red);
    订单(红线);
    //设置最大尺寸(新尺寸(200300));
    初始化组件();
    }
    私有组件(){
    // 
    emailLabel=新的JLabel(“电子邮件”);
    mobileLabel=新的JLabel(“移动”);
    名称标签=新的JLabel(“名称”);
    phoneLabel=新的JLabel(“电话”);
    姓氏标签=新的JLabel(“姓氏”);
    emailErrorLabel=新的JLabel();
    mobileErrorLabel=新的JLabel();
    nameErrorLabel=新的JLabel();
    phoneErrorLabel=新的JLabel();
    姓氏错误标签=新的JLabel();
    mobileInputField=新的JTextField();
    nameInputField=新的JTextField();
    phoneInputField=新的JTextField();
    姓氏inputfield=新的JTextField();
    emailInputField=新的JTextField();
    setDocument(新的JTextFieldLimit(10));
    nameInputField.setDocument(新的JTextFieldLimit(10));
    setDocument(新的JTextFieldLimit(10));
    setDocument(新的JTextFieldLimit(10));
    setDocument(新的JTextFieldLimit(10));
    setName(“mobileInputField”);
    setName(“nameInputField”);
    setName(“phoneInputField”);
    setName(“姓氏输入字段”);
    setName(“emailInputField”);
    jsepator separator1=新的jsepator();
    jsepator separator2=新的jsepator();
    jsepator separator3=新的jsepator();
    jsepator separator4=新的jsepator();
    jsepator separator 5=新的jsepator();
    // 
    // 
    //...
    //...
    KeyListener KeyListener=新的KeyAdapter(){
    @凌驾
    public void keyTyped(KeyEvent KeyEvent){
    //...
    }
    @凌驾
    按下公共无效键(KeyEvent KeyEvent){
    按键方式(按键事件);
    }
    @凌驾
    公共无效密钥已释放(KeyEvent KeyEvent){
    //...
    }
    };
    //...
    FocusListener FocusListener=new FocusAdapter(){
    @凌驾
    获得公共无效焦点(焦点事件焦点事件){
    focusGainedMethod(focusEvent);
    }
    @凌驾
    公共无效焦点丢失(FocusEvent FocusEvent){
    focusLostMethod(focusEvent);
    }
    };
    mobileInputField.addFocusListener(focusListener);
    mobileInputField.addKeyListener(keyListener);
    nameInputField.addFocusListener(focusListener);
    nameInputField.addKeyListener(keyListener);
    addFocusListener(focusListener);
    addKeyListener(keyListener);
    姓氏InputField.addFocusListener(focusListener);
    姓氏InputField.addKeyListener(keyListener);
    emailInputField.addFocusListener(focusListener);
    emailInputField.addKeyListener(keyListener);
    //
    // 
    mobileInputField.setBorder(空);
    nameInputField.setboorder(空);
    phoneInputField.SetBookOrder(空);
    姓氏inputfield.setboorder(null);
    emailInputField.setBorder(空);
    setBackground(新java.awt.Color(255、255、255));
    //
    // 
    GridBagLayout GridBagLayout=新的GridBagLayout();
    setLayout(gridBagLayout);
    //该组件用于将JPanel中的所有组件锚定到右上角
    GridBagConstraints horizontalFill=新的GridBagConstraints();
    horizontalFill.anchor=GridBagConstraints.NORTHWEST;
    horizontalFill.fill=GridBagConstraints.HORIZONTAL;
    水平填充。网格宽度=4;
    水平填充。权重x=1;
    添加(Box.createHorizontalGlue(),horizontalFill);
    添加(名称标签,
    新GBC(0,0)
    .固定盘(1,1)
    .设置填充(GBC.水平)