Lots of time application required compulsory input from user, in this example i am going to show blinking border on swing input component JTextFiled, you can add same pattren in other component.
I made a calss which extend JTextFiled which implement funtionalty.
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JTextField;
import javax.swing.border.Border;
public class NxGTextField extends JTextField {
private final Border emptyBorder = javax.swing.BorderFactory.createLineBorder(new java.awt.Color(255, 51, 51, 0));
private final Border errorBorder = javax.swing.BorderFactory.createLineBorder(new java.awt.Color(255, 51, 51));
private final int errorBlink = 6;
private final int errorBlinkDelay = 100;
public NxGTextField() {
super();
setBorder(emptyBorder);
}
public void setError(boolean isError) {
final Timer errorTimmer = new Timer();
if (isError) {
TimerTask tm = new TimerTask() {
int i = 0;
@Override
public void run() {
if (i >= errorBlink) {
setBorder(errorBorder);
errorTimmer.cancel();
} else {
if (i % 2 == 0) {
setBorder(errorBorder);
} else {
setBorder(emptyBorder);
}
++i;
}
}
};
errorTimmer.schedule(tm, 0, errorBlinkDelay);
} else {
errorTimmer.cancel();
setBorder(emptyBorder);
}
}
}
How to use it:
public class JTextFiledBlinkingBorderExample extends javax.swing.JFrame {
private javax.swing.JButton btnBlink;
private javax.swing.JLabel jLabel1;
private component.NxGTextField txtUserName;
public JTextFiledBlinkingBorderExample() {
initComponents();
setBounds(0, 0, 367, 100);
setLocationRelativeTo(null);
}
private void initComponents() {
txtUserName = new component.NxGTextField();
btnBlink = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
getContentPane().add(txtUserName);
txtUserName.setBounds(110, 20, 130, 20);
btnBlink.setText("Blink");
btnBlink.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnBlinkActionPerformed(evt);
}
});
getContentPane().add(btnBlink);
btnBlink.setBounds(250, 20, 80, 23);
jLabel1.setText("User Name");
getContentPane().add(jLabel1);
jLabel1.setBounds(30, 20, 70, 20);
pack();
}
private void btnBlinkActionPerformed(java.awt.event.ActionEvent evt) {
if (txtUserName.getText().length() <= 0) {
txtUserName.setError(true);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JTextFiledBlinkingBorderExample().setVisible(true);
}
});
}
}
I made a calss which extend JTextFiled which implement funtionalty.
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JTextField;
import javax.swing.border.Border;
public class NxGTextField extends JTextField {
private final Border emptyBorder = javax.swing.BorderFactory.createLineBorder(new java.awt.Color(255, 51, 51, 0));
private final Border errorBorder = javax.swing.BorderFactory.createLineBorder(new java.awt.Color(255, 51, 51));
private final int errorBlink = 6;
private final int errorBlinkDelay = 100;
public NxGTextField() {
super();
setBorder(emptyBorder);
}
public void setError(boolean isError) {
final Timer errorTimmer = new Timer();
if (isError) {
TimerTask tm = new TimerTask() {
int i = 0;
@Override
public void run() {
if (i >= errorBlink) {
setBorder(errorBorder);
errorTimmer.cancel();
} else {
if (i % 2 == 0) {
setBorder(errorBorder);
} else {
setBorder(emptyBorder);
}
++i;
}
}
};
errorTimmer.schedule(tm, 0, errorBlinkDelay);
} else {
errorTimmer.cancel();
setBorder(emptyBorder);
}
}
}
How to use it:
public class JTextFiledBlinkingBorderExample extends javax.swing.JFrame {
private javax.swing.JButton btnBlink;
private javax.swing.JLabel jLabel1;
private component.NxGTextField txtUserName;
public JTextFiledBlinkingBorderExample() {
initComponents();
setBounds(0, 0, 367, 100);
setLocationRelativeTo(null);
}
private void initComponents() {
txtUserName = new component.NxGTextField();
btnBlink = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
getContentPane().add(txtUserName);
txtUserName.setBounds(110, 20, 130, 20);
btnBlink.setText("Blink");
btnBlink.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnBlinkActionPerformed(evt);
}
});
getContentPane().add(btnBlink);
btnBlink.setBounds(250, 20, 80, 23);
jLabel1.setText("User Name");
getContentPane().add(jLabel1);
jLabel1.setBounds(30, 20, 70, 20);
pack();
}
private void btnBlinkActionPerformed(java.awt.event.ActionEvent evt) {
if (txtUserName.getText().length() <= 0) {
txtUserName.setError(true);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JTextFiledBlinkingBorderExample().setVisible(true);
}
});
}
}
