在Swing中的表单验证期间绘制警告符号

时间:2013-01-05 09:00:50

标签: java swing background jtextfield

我开发了一个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);
}

}

以下是我的简单应用的输出:

enter image description here

现在我还想在错误字段的左下角绘制一个警告符号(缓冲图像)。任何人都可以帮我解决这个问题,因为我不知道在哪里画图像。 (我想在学习它的应用程序时使用JLayeredPane来实现它,任何代码片段都会有所帮助。)

1 个答案:

答案 0 :(得分:8)

为什么不简单地使用内置的Swing警告图标JLabel

添加LayoutManager(使用适当的UIManager.getIcon("OptionPane.warningIcon")来定位它)

enter image description here

像这样:

JLabel label=new JLabel(UIManager.getIcon("OptionPane.warningIcon"));

请参阅here了解更多信息。

<强>更新

根据您的评论,我宁愿使用GlassPane(并将JLabel添加到glasspane),而不是JLayeredPane。有关RootPanes

的更多信息,请参阅here

一些建议:

  • 不要不必要地延长JFrame

  • 请勿在{{1​​}}上致电setSize。在必要时使用正确的JFrame和/或覆盖LayoutManager,并在设置getPreferredSize()可见之前用setSize 替换pack()来电。

  • 除非您想与其他类共享功能,否则不要在类上实现JFrame

  • 养成使用FocusListener vs FocusAdapter的习惯,这适用于附加听众的少数人,FocusListener可以替换为MouseListener。这允许我们只覆盖我们想要的方法。在这种情况下,监听器是正确的,因为我们对两种重写方法都做了一些事情,但正如我更多地谈到这种习惯

  • 除非您因为某种原因而忽略该方法,否则也始终致电MouseAdapter实施已覆盖的方法super.XXX

以下是包含上述修复的代码,包括glasspane,当字段为红色时显示警告图标:

enter image description here

更正时删除它:

enter image description here

focusGained(FocusEvent fe)