我开发了一个swing表单,用于验证条目,因为焦点从JTextComponent中丢失 如果输入正确,则背景涂成绿色,否则涂成红色。
以下是代码: -
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.JTextComponent;
public class Form extends JFrame implements FocusListener{
JTextField fname,lname,phone,email,address;
BufferedImage img;
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){public void run(){new Form();}});
}
public Form()
{
super("Form with Validation Capability");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,300);
setLayout(new GridLayout(5,3));
try {
img=ImageIO.read(new File("src/warning.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
add(new JLabel("First Name :"));
add(fname=new JTextField(20));
add(new JLabel("Last Name :"));
add(lname=new JTextField(20));
add(new JLabel("Phone Number :"));
add(phone=new JTextField(10));
add(new JLabel("Email:"));
add(email=new JTextField(20));
add(new JLabel("Address :"));
add(address=new JTextField(20));
fname.addFocusListener(this);
lname.addFocusListener(this);
phone.addFocusListener(this);
email.addFocusListener(this);
address.addFocusListener(this);
setVisible(true);
}
public void focusGained(FocusEvent e)
{
((JTextComponent) e.getSource()).setBackground(Color.WHITE);
}
public void focusLost(FocusEvent e)
{
if(e.getSource().equals(fname))
{
validationForText(fname);
}
else if(e.getSource().equals(lname))
{
validationForText(lname);
}
else if(e.getSource().equals(email))
{
validationForEmail(email);
}
else if(e.getSource().equals(phone))
{
validationForNumber(phone);
}
else{
((JTextComponent) e.getSource()).setBackground(Color.GREEN);
}
}
public void validationForText(JTextComponent comp)
{
String temp=comp.getText();
if (temp.matches("^[A-Za-z]+$")) {
comp.setBackground(Color.GREEN);
}
else
comp.setBackground(Color.RED);
}
public void validationForNumber(JTextComponent comp)
{
String text=comp.getText();
if(text.matches("^[0-9]+$"))
comp.setBackground(Color.GREEN);
else
comp.setBackground(Color.RED);
}
public void validationForEmail(JTextComponent comp)
{
String text=comp.getText();
if(text.matches("[^@]+@([^.]+\\.)+[^.]+"))
comp.setBackground(Color.GREEN);
else
comp.setBackground(Color.RED);
}
}
以下是我的简单应用的输出:
现在我还想在错误字段的左下角绘制一个警告符号(缓冲图像)。任何人都可以帮我解决这个问题,因为我不知道在哪里画图像。 (我想在学习它的应用程序时使用JLayeredPane来实现它,任何代码片段都会有所帮助。)
答案 0 :(得分:8)
为什么不简单地使用内置的Swing警告图标JLabel
LayoutManager
(使用适当的UIManager.getIcon("OptionPane.warningIcon")
来定位它)
像这样:
JLabel label=new JLabel(UIManager.getIcon("OptionPane.warningIcon"));
请参阅here了解更多信息。
<强>更新强>
根据您的评论,我宁愿使用GlassPane
(并将JLabel
添加到glasspane),而不是JLayeredPane
。有关RootPanes
一些建议:
不要不必要地延长JFrame
请勿在{{1}}上致电setSize
。在必要时使用正确的JFrame
和/或覆盖LayoutManager
,并在设置getPreferredSize()
可见之前用setSize
替换pack()
来电。
除非您想与其他类共享功能,否则不要在类上实现JFrame
。
养成使用FocusListener
vs FocusAdapter
的习惯,这适用于附加听众的少数人,FocusListener
可以替换为MouseListener
。这允许我们只覆盖我们想要的方法。在这种情况下,监听器是正确的,因为我们对两种重写方法都做了一些事情,但正如我更多地谈到这种习惯
除非您因为某种原因而忽略该方法,否则也始终致电MouseAdapter
实施已覆盖的方法super.XXX
以下是包含上述修复的代码,包括glasspane,当字段为红色时显示警告图标:
更正时删除它:
focusGained(FocusEvent fe)