使用 Java Swing 组件时无法使用正则表达式验证 JTextField 的值
Cannot validate JTextField's value using Regular expression while using Java Swing components
我正在创建一个简单的 Java Swing 应用程序来验证 IP 地址。我加了个JTextField
、JButton
、JLabel
。 JTextField
应接受 AlphaNumeric 值,即 - 用户可以输入系统名称或系统 IP 地址。我为此场景添加了 2 个验证。单击 JButton
时,首先它将使用此模式检查 IP 地址的格式(以识别它是名称还是 IP 地址)
"^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$".
如果它是一个 IP 地址,那么它将使用此模式检查它是否是一个有效的 IP 地址
"^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
并显示一条消息 - 有效与否。
问题 - 如果我输入格式不正确的无效 IP 地址,例如 -
299.143.154.167
第一次验证没有成功。
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class RegexDemo {
public static String regExToCheckIPAddress = "^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$";
public static Pattern pattern1;
public static Matcher matcher1;
public static String regExToCheckValidIPAddress = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
public static Pattern pattern2;
public static Matcher matcher2;
public static void main(String[] args) {
JFrame frame = new JFrame("IP Address validation");
JPanel panel = new JPanel();
JTextField txtField = new JTextField();
JButton btn = new JButton("Validate");
JLabel lbl = new JLabel();
lbl.setFont(new Font("Arial", Font.PLAIN, 12));
lbl.setForeground(Color.RED);
panel.setBounds(5,5,350,250);
panel.setLayout(null);
txtField.setBounds(5,5,130,25);
btn.setBounds(20,40,80,25);
lbl.setBounds(145,5,100,25);
panel.add(txtField);
panel.add(btn);
panel.add(lbl);
frame.add(panel);
frame.setSize(330,300);
frame.setLayout(null);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
String text = txtField.getText().trim();
pattern1 = Pattern.compile(regExToCheckIPAddress);
matcher1 = pattern1.matcher(text);
pattern2 = Pattern.compile(regExToCheckValidIPAddress);
matcher2 = pattern2.matcher(text);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (matcher1.matches()) {
if (!matcher2.matches()) {
lbl.setText("Not a valid IP Address");
} else {
lbl.setText("Valid IP Address");
}
} else {
lbl.setText("Not an IP Address");
}
}
});
}
}
如果我输入字母数字名称,它应该显示'Not an IP Address',如果我输入' 299.143.154.167',应该显示'Not a valid IP Address',如果'234.143.154.167',应该显示'Valid IP Address'.
如果我不使用与 Swing 相关的组件(没有 UI),这段代码工作正常。谁能帮我解决这个问题?
问题是您使用的是文本字段的默认文本。您需要在按下按钮时获取文本。获取文本后,您需要创建匹配器。
您需要在 actionPerformed 方法中获取文本并使用新文本创建匹配器,如下所示:
public void actionPerformed(ActionEvent ae) {
String text = txtField.getText().trim();
matcher1 = pattern1.matcher(text);
matcher2 = pattern2.matcher(text);
if (matcher1.matches()) {
if (!matcher2.matches()) {
lbl.setText("Not a valid IP Address");
} else {
lbl.setText("Valid IP Address");
}
} else {
lbl.setText("Not an IP Address");
}
}
我正在创建一个简单的 Java Swing 应用程序来验证 IP 地址。我加了个JTextField
、JButton
、JLabel
。 JTextField
应接受 AlphaNumeric 值,即 - 用户可以输入系统名称或系统 IP 地址。我为此场景添加了 2 个验证。单击 JButton
时,首先它将使用此模式检查 IP 地址的格式(以识别它是名称还是 IP 地址)
"^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$".
如果它是一个 IP 地址,那么它将使用此模式检查它是否是一个有效的 IP 地址
"^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
并显示一条消息 - 有效与否。
问题 - 如果我输入格式不正确的无效 IP 地址,例如 -
299.143.154.167
第一次验证没有成功。
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class RegexDemo {
public static String regExToCheckIPAddress = "^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$";
public static Pattern pattern1;
public static Matcher matcher1;
public static String regExToCheckValidIPAddress = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
public static Pattern pattern2;
public static Matcher matcher2;
public static void main(String[] args) {
JFrame frame = new JFrame("IP Address validation");
JPanel panel = new JPanel();
JTextField txtField = new JTextField();
JButton btn = new JButton("Validate");
JLabel lbl = new JLabel();
lbl.setFont(new Font("Arial", Font.PLAIN, 12));
lbl.setForeground(Color.RED);
panel.setBounds(5,5,350,250);
panel.setLayout(null);
txtField.setBounds(5,5,130,25);
btn.setBounds(20,40,80,25);
lbl.setBounds(145,5,100,25);
panel.add(txtField);
panel.add(btn);
panel.add(lbl);
frame.add(panel);
frame.setSize(330,300);
frame.setLayout(null);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
String text = txtField.getText().trim();
pattern1 = Pattern.compile(regExToCheckIPAddress);
matcher1 = pattern1.matcher(text);
pattern2 = Pattern.compile(regExToCheckValidIPAddress);
matcher2 = pattern2.matcher(text);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (matcher1.matches()) {
if (!matcher2.matches()) {
lbl.setText("Not a valid IP Address");
} else {
lbl.setText("Valid IP Address");
}
} else {
lbl.setText("Not an IP Address");
}
}
});
}
}
如果我输入字母数字名称,它应该显示'Not an IP Address',如果我输入' 299.143.154.167',应该显示'Not a valid IP Address',如果'234.143.154.167',应该显示'Valid IP Address'.
如果我不使用与 Swing 相关的组件(没有 UI),这段代码工作正常。谁能帮我解决这个问题?
问题是您使用的是文本字段的默认文本。您需要在按下按钮时获取文本。获取文本后,您需要创建匹配器。
您需要在 actionPerformed 方法中获取文本并使用新文本创建匹配器,如下所示:
public void actionPerformed(ActionEvent ae) {
String text = txtField.getText().trim();
matcher1 = pattern1.matcher(text);
matcher2 = pattern2.matcher(text);
if (matcher1.matches()) {
if (!matcher2.matches()) {
lbl.setText("Not a valid IP Address");
} else {
lbl.setText("Valid IP Address");
}
} else {
lbl.setText("Not an IP Address");
}
}