Friday, 30 November 2012

JTextField Blink Border

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);
            }
        });
    }
}