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