Đối tượng hỗ trợ Validate control trên JFrame

26/4/13
88
24
8
Đây là đối tượng hỗ trợ cho việc validate dữ liệu, do em tự viết ra, các anh thấy có gì thiếu sót thì góp ý cho em ^.^, mà sao em thấy box Validating vắng vẻ quá :(

Lớp Validate:
PHP:
import java.awt.Component;
import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
* Đối tượng hỗ trợ cho việc validate các control trên Form
*
* @author KimHao
*/
public class Validate {
    /**
    * Mảng hai chiều chứa thông tin của các control, được gán giá trị lúc khởi
    * tạo đối tượng bằng contrustor hoặc bằng bộ getter và setter
    */
    private Object[][] objectToValidate;

    /**
    * Contrustor khởi tạo validate
    *
    * @param objectToValidate là các control cần validate,
    * là các mảng Object, phần tử số 1 là biến control,
    * phần tử 2 là tên control, các phần tử còn lại
    * là các lớp hiện thực của ValidateFunction
    * để chỉ định các hình thức kiểm tra (như bắt buộc,
    * RegEx, ...)
    */
    public Validate(Object[]... objectToValidate){
        this.objectToValidate = objectToValidate.clone();
    }

    /**
    * Lấy thông tin của toàn bộ control
    *
    * @return
    * Toàn bộ các object được quản lý
    */
    public Object[][] getObjectToValidate() {
        return objectToValidate;
    }

    /**
    * Lấy thông tin của control được chỉ định
    *
    * @param index là index của control cần lấy
    * @return
    * Thông tin của control được chỉ định
    */
    public Object[] getObjectToValidate(int index) {
        return objectToValidate[index];
    }

    /**
    * Set lại các control cần validate
    *
    * @param objectToValidate là các control cần validate,
    * là các mảng Object, phần tử số 1 là biến control,
    * phần tử 2 là tên control, các phần tử còn lại
    * là các lớp hiện thực của ValidateFunction
    * để chỉ định các hình thức kiểm tra (như bắt buộc,
    * RegEx, ...)
    */
    public void setObjectToValidate(Object[]... objectToValidate) {
        this.objectToValidate = objectToValidate.clone();
    }

    /**
    * Kiểm tra lỗi và trả về thông báo lỗi (nếu có)
    * toàn bộ control có khai báo trong contrustor
    *
    * @return
    * - Rỗng nếu không có lỗi<br/>
    * - Chuỗi thông báo lỗi nếu có lỗi
    */
    public String getErrorMessage(){
        String errorMessage = "";
        for (int i = 0; i < objectToValidate.length; i++) {
            Object[] arrObject = objectToValidate[i];
            Object control = arrObject[0];
            String controlName = arrObject[1].toString();
            String messageControl;

            if(arrObject.length > 2){
                Object[] arrObjectTemp = new Object[arrObject.length - 2];
                System.arraycopy(arrObject, 2, arrObjectTemp, 0, arrObject.length - 2);
                messageControl = getErrorMessageControl(control, controlName, arrObjectTemp);
            }else{
                messageControl = getErrorMessageControl(control, controlName);
            }
            errorMessage += messageControl;
        }
        return errorMessage;
    }

    /**
    * Kiểm tra lỗi và hiện thông báo lỗi (nếu có)
    * toàn bộ control có khai báo trong contrustor
    *
    * @param cmpnt tham số của hàm JOptionPane.showMessageDialog
    * @return
    * - True nếu không có lỗi<br/>
    * - False thông báo lỗi nếu có lỗi
    */
    public boolean validate(Component cmpnt){
        String errMessage = getErrorMessage();
        if(errMessage.isEmpty()){
            return true;
        }else{
            JOptionPane.showMessageDialog(cmpnt, errMessage);
            return false;
        }
    }

    /**
    * Reset toàn bộ control có khai báo trong contrustor
    */
    public void reset(){
        for (int i = 0; i < objectToValidate.length; i++) {
            resetControl(objectToValidate[i][0]);
        }
    }

    /**
    * Validate control được chỉ định (không có khai báo trong contrustor) và
    * hiển thị thông báo lỗi (nếu có)
    *
    * @param control là control cần được validate
    * @param name là tên control cần được validate
    * @param cmpnt tham số của hàm JOptionPane.showMessageDialog
    * @param arrVf là các lớp hiện thực của ValidateFunction
    * hoặc là mảng các lớp hiện thực của ValidateFunction
    * để chỉ định các hình thức kiểm tra (như bắt buộc,
    * RegEx, ...)
    * @return
    * - True nếu không có lỗi<br/>
    * - False thông báo lỗi nếu có lỗi
    */
    public static boolean validateControl(Object control, String name, Component cmpnt, Object... arrVf){
        String errMessage = getErrorMessageControl(control, name, arrVf);
        if(errMessage.isEmpty()){
            return true;
        }else{
            JOptionPane.showMessageDialog(cmpnt, errMessage);
            return false;
        }
    }

    /**
    * Validate control được chỉ định (có khai báo trong contrustor) và
    * hiển thị thông báo lỗi (nếu có)
    *
    * @param control là control cần được validate
    * @param cmpnt tham số của hàm JOptionPane.showMessageDialog
    * @return
    */
    public boolean validateControl(Object control, Component cmpnt){
        String errMessage = getErrorMessageControl(control);
        if(errMessage.isEmpty()){
            return true;
        }else{
            JOptionPane.showMessageDialog(cmpnt, errMessage);
            return false;
        }
    }

    /**
    * Validate nhiều control được chỉ định (có khai báo trong contrustor) và
    * hiển thị thông báo lỗi (nếu có)
    *
    * @param cmpnt tham số của hàm JOptionPane.showMessageDialog
    * @param control là các control
    * hoặc là mảng các control cần được validate
    * @return
    */
    public boolean validateControls(Component cmpnt, Object... control){
        String errMessage = getErrorMessageControls(control);
        if(errMessage.isEmpty()){
            return true;
        }else{
            JOptionPane.showMessageDialog(cmpnt, errMessage);
            return false;
        }
    }

    /**
    * Validate control được chỉ định (không có khai báo trong contrustor) và
    * và trả về thông báo lỗi (nếu có)
    *
    * @param control là control cần được validate
    * @param name là tên control cần được validate
    * @param arrVf là các lớp hiện thực của ValidateFunction
    * hoặc là mảng các lớp hiện thực của ValidateFunction
    * để chỉ định các hình thức kiểm tra (như bắt buộc,
    * RegEx, ...)
    * @return
    * - Rỗng nếu không có lỗi<br/>
    * - Chuỗi thông báo lỗi nếu có lỗi
    */
    public static String getErrorMessageControl(Object control, String name, Object... arrVf){
        String messageControl = "";
        try{
            Object[] objTemp;
            if(arrVf[0] instanceof Object[]){
                objTemp = (Object[])arrVf[0];
            }else{
                objTemp = arrVf;
            }
            for (int i = 0; i < objTemp.length; i++) {
                String message = ((ValidateFunction)objTemp[i]).valid(control, name);
                if(!message.isEmpty()){
                    messageControl += message + "\n";
                }
            }
        }catch(Exception ex){
        }
        if((!messageControl.endsWith("\n")) && (!messageControl.isEmpty())){
            messageControl += "\n";
        }
        return messageControl;
    }

    /**
    * Validate control được chỉ định (có khai báo trong contrustor) và
    * và trả về thông báo lỗi (nếu có)
    *
    * @param control là control cần được validate
    * @return
    * - Rỗng nếu không có lỗi<br/>
    * - Chuỗi thông báo lỗi nếu có lỗi
    */
    public String getErrorMessageControl(Object control){
        String errorMessage = "";
        for (int i = 0; i < objectToValidate.length; i++) {
            if(objectToValidate[i][0] == control){
                Object[] arrObject = objectToValidate[i];
                String controlName = arrObject[1].toString();
                String messageControl;

                if(arrObject.length > 2){
                    Object[] arrObjectTemp = new Object[arrObject.length - 2];
                    System.arraycopy(arrObject, 2, arrObjectTemp, 0, arrObject.length - 2);
                    messageControl = getErrorMessageControl(control, controlName, arrObjectTemp);
                }else{
                    messageControl = getErrorMessageControl(control, controlName);
                }
                if(!messageControl.isEmpty()){
                    errorMessage += messageControl;
                }
            }
        }
        return errorMessage;
    }

    /**
    * Validate control được chỉ định (có khai báo trong contrustor) và
    * và trả về thông báo lỗi (nếu có)
    *
    * @param control là các control
    * hoặc là mảng các control cần được validate
    * @return
    * - Rỗng nếu không có lỗi<br/>
    * - Chuỗi thông báo lỗi nếu có lỗi
    */
    public String getErrorMessageControls(Object... control){
        String errorMessage = "";
        Object[] objTemp;
        if(control[0] instanceof Object[]){
            objTemp = (Object[])control[0];
        }else{
            objTemp = control;
        }
        for (int j = 0; j < control.length; j++) {
            Object object = objTemp[j];
            String error = getErrorMessageControl(object);
            if(!error.isEmpty()){
                errorMessage += error;
            }
        }
        return errorMessage;
    }

    /**
    * Reset control được chỉ định (có hoặc không có khai báo trong contrustor)
    *
    * @param control là control cần được validate
    */
    public static void resetControl(Object control){
        if(control instanceof JTextField){
            ((JTextField) control).setText("");
        }else if(control instanceof JTextArea){
            ((JTextArea) control).setText("");
        }else if(control instanceof JPasswordField){
            ((JPasswordField) control).setText("");
        }else if(control instanceof JComboBox){
            ((JComboBox) control).setSelectedIndex(0);
        }else if(control instanceof JList){
            ((JList) control).clearSelection();
        }else if(control instanceof JTable){
            ((JTable) control).clearSelection();
        }else if(control instanceof ButtonGroup){
            ((ButtonGroup) control).clearSelection();
        }
    }

    /**
    * Gán giá trị cho control (có khai báo trong contrustor, là Text Field, Text Area, Password Field, Combo Box)
    *
    * @param i là index của control
    * @param str là giá trị cần set
    */
    public void setText(int i, String str){
        Object control = objectToValidate[i][0];
        if(control instanceof JTextField){
            ((JTextField) control).setText(str);
        }else if(control instanceof JTextArea){
            ((JTextArea) control).setText(str);
        }else if(control instanceof JPasswordField){
            ((JPasswordField) control).setText(str);
        }else if(control instanceof JComboBox){
            ((JComboBox) control).setSelectedItem(str);
        }
    }

    /**
    * Set Editable control (có khai báo trong contrustor, là Text Field, Text Area, Password Field, Combo Box)
    *
    * @param i là index của control
    * @param state là giá trị cần set (true/false)
    */
    public void setEditable(int i, boolean state){
        Object control = objectToValidate[i][0];
        if(control instanceof JTextField){
            ((JTextField) control).setEditable(state);
        }else if(control instanceof JTextArea){
            ((JTextArea) control).setEditable(state);
        }else if(control instanceof JPasswordField){
            ((JPasswordField) control).setEditable(state);
        }else if(control instanceof JComboBox){
            ((JComboBox) control).setEditable(state);
        }
    }

    /**
    * Set Editable control (có khai báo trong contrustor, là Text Field, Text Area, Password Field, Combo Box)<br />
    * Tương tự như void setEditable(int i, boolean state), nhưng nếu control là Combo Box thì set enabled
    * chứ không phải là editable
    *
    * @param i là index của control
    * @param state là giá trị cần set (true/false)
    */
    public void setEditableSpecial(int i, boolean state){
        Object control = objectToValidate[i][0];
        if(control instanceof JTextField){
            ((JTextField) control).setEditable(state);
        }else if(control instanceof JTextArea){
            ((JTextArea) control).setEditable(state);
        }else if(control instanceof JPasswordField){
            ((JPasswordField) control).setEditable(state);
        }else if(control instanceof JComboBox){
            ((JComboBox) control).setEnabled(state);
        }
    }

    /**
    * Set Enabled control (có khai báo trong contrustor, là Text Field, Text Area, Password Field, Combo Box)
    *
    * @param i là index của control
    * @param state là giá trị cần set (true/false)
    */
    public void setEnabled(int i, boolean state){
        Object control = objectToValidate[i][0];
        if(control instanceof JTextField){
            ((JTextField) control).setEnabled(state);
        }else if(control instanceof JTextArea){
            ((JTextArea) control).setEnabled(state);
        }else if(control instanceof JPasswordField){
            ((JPasswordField) control).setEnabled(state);
        }else if(control instanceof JComboBox){
            ((JComboBox) control).setEnabled(state);
        }
    }

    /**
    * Lấy giá trị của control (có khai báo trong contrustor, là Text Field, Text Area, Password Field, Combo Box)
    *
    * @param i là index của control
    * @return
    * Giá trị của control yêu cầu, nếu control không phải là
    * Text Field, Text Area, Combo Box thì trả về giá trị null
    */
    public String getText(int i){
        Object control = objectToValidate[i][0];
        if(control instanceof JTextField){
            return ((JTextField) control).getText();
        }else if(control instanceof JTextArea){
            return ((JTextArea) control).getText();
        }else if(control instanceof JPasswordField){
            return new String(((JPasswordField) control).getPassword());
        }else if(control instanceof JComboBox){
            return ((JComboBox) control).getSelectedItem().toString();
        }
        return null;
    }

    /**
    * Tạo ra thể hiện của ValidateFunction, kiểm tra bắt buộc
    *
    * @return
    * Thể hiện của ValidateFunction
    */
    public static ValidateFunction getRequestValidate(){
        return new ValidateFunction(){
            @Override
            public String valid(Object control, String name) {
                String messageControl = "";
                final String strEmpty = " is empty !";
                final String strNotSelect = "You are not select ";
                if(control instanceof JTextField){
                    if(((JTextField) control).getText().isEmpty()){
                        messageControl = name + strEmpty;
                    }
                }else if(control instanceof JTextArea){
                    if(((JTextArea) control).getText().isEmpty()){
                        messageControl = name + strEmpty;
                    }
                }else if(control instanceof JPasswordField){
                    if(new String((((JPasswordField) control).getPassword())).isEmpty()){
                        messageControl = name + strEmpty;
                    }
                }else if(control instanceof JComboBox){
                    if(((JComboBox) control).getSelectedIndex() == 0){
                        messageControl = strNotSelect + name + " !";
                    }
                }else if(control instanceof JList){
                    if(((JList) control).getSelectedIndex() == -1){
                        messageControl = strNotSelect + name + " !";
                    }
                }else if(control instanceof JTable){
                    if(((JTable) control).getSelectedRow() == -1){
                        messageControl = strNotSelect + name + " !";
                    }
                }else if(control instanceof ButtonGroup){
                    if(((ButtonGroup) control).getSelection() == null){
                        messageControl = strNotSelect + name + " !";
                    }
                }
                return messageControl;
            }
        };
    }

    /**
    * RexEx kiểm tra số nguyên dương
    */
    public final static String regExPositiveInteger = "^(\\d+)?$";

    /**
    * RexEx kiểm tra số nguyên
    */
    public final static String regExInteger = "^(-?\\d+)?$";

    /**
    * RexEx kiểm tra số nguyên âm
    */
    public final static String regExNegativeInteger = "^(-\\d+)?$";

    /**
    * RexEx kiểm tra số thực dương
    */
    public final static String regExPositiveReal = "^(\\d+(\\.\\d+)?)?$";

    /**
    * RexEx kiểm tra số thực
    */
    public final static String regExReal = "^(-?\\d+(\\.\\d+)?)?$";

    /**
    * RexEx kiểm tra số thực âm
    */
    public final static String regExNegativeReal = "^(-\\d+(\\.\\d+)?)?$";

    /**
    * RexEx kiểm tra email
    */
    public final static String regExEmail = "^([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4}))?$";

    /**
    *
    * @param regEx chuỗi RegEx để validate
    * @param format là chuỗi để hiển thị thông báo lỗi
    * @return
    */
    public static ValidateFunction getRegExValidate(String regEx, String format){
        return new RegExValidate(regEx, format);
    }
}
class RegExValidate implements ValidateFunction {
    String strRegEx;
    String strFormat;

    public RegExValidate(String strRegEx, String strFormat) {
        this.strRegEx = strRegEx;
        this.strFormat = strFormat;
    }

    @Override
    public String valid(Object control, String name) {
        String messageControl = "";
        final String strValid = " is not valid format (" + strFormat + ") !";
        if(control instanceof JTextField){
            if(!((JTextField) control).getText().matches(strRegEx)){
                messageControl = name + strValid;
            }
        }else if(control instanceof JTextArea){
            if(!((JTextArea) control).getText().matches(strRegEx)){
                messageControl = name + strValid;
            }
        }
        return messageControl;
    }
}
Lớp ValidateFunction:
PHP:
/**
* Interface dùng để tạo hàm kiểm tra bổ sung cho Validate
*
* @author KimHao
*/
public interface ValidateFunction {
    /**
    * Hàm validate dữ liệu bổ sung
    *
    * @param control là control được validate, dùng cho trường hợp
    * có nhiều control dùng một ValidateFunction
    * @param name là tên control được validate, dùng cho trường hợp
    * có nhiều control dùng một ValidateFunction
    * @return
    * - Rỗng nếu không có lỗi<br/>
    * - Chuỗi thông báo lỗi nếu có lỗi
    */
    public String valid(Object control, String name);
}
Project (lớp Validate + lớp ValidateFunction + demo) em đính kèm bên dưới, em không post code demo lên được vì giới hạn 20000 kí tự

Đối tượng có khả năng validate, reset control, hoặc là validate từng control một (click từng lable tương ứng) hoặc validate một vài control được chỉ định (nút Name & Address).
Có gì thắc mắc thì các anh cứ comment để em hoàn thiện nó hơn !
 

Attachments

  • Like
Reactions: JackV and LTV
26/4/13
88
24
8
Code demo trên JFrame:
PHP:
package demo;

import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import validate.Validate;
import validate.ValidateFunction;

/**
*
* @author KimHao
*/
public class DemoValidate extends javax.swing.JFrame {

    /**
    * Creates new form DemoValidate
    */
    public DemoValidate() {
        initComponents();
        validate = new Validate(new Object[]{txtName, "Name", Validate.getRequestValidate()},
                                new Object[]{txaAddress, "Address",
                                    Validate.getRequestValidate(),
                                    new ValidateFunction(){
                                        @Override
                                        public String valid(Object control, String name) {
                                            String errorMessage = "";
                                            if(!((JTextArea)control).getText().startsWith("P")){
                                                errorMessage = name + " must starts with \"P\" !";
                                            }
                                            return errorMessage;
                                        }
                                    },
                                    new ValidateFunction(){
                                        @Override
                                        public String valid(Object control, String name) {
                                            String errorMessage = "";
                                            if(!((JTextArea)control).getText().endsWith("m")){
                                                errorMessage = name + " must ends with \"m\" !";
                                            }
                                            return errorMessage;
                                        }
                                    }
                                },
                                new Object[]{cbFees, "Fees", Validate.getRequestValidate()},
                                new Object[]{lstColor, "Color", Validate.getRequestValidate()},
                                new Object[]{tblResult, "Result", Validate.getRequestValidate()},
                                new Object[]{grpGrade, "Grade", Validate.getRequestValidate()}
                            );
    }

    /**
    * This method is called from within the constructor to initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is always
    * regenerated by the Form Editor.
    */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        grpGrade = new javax.swing.ButtonGroup();
        lblName = new javax.swing.JLabel();
        lblAddress = new javax.swing.JLabel();
        lblFees = new javax.swing.JLabel();
        lblGrade = new javax.swing.JLabel();
        lblColor = new javax.swing.JLabel();
        lblResult = new javax.swing.JLabel();
        txtName = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        txaAddress = new javax.swing.JTextArea();
        cbFees = new javax.swing.JComboBox();
        jScrollPane2 = new javax.swing.JScrollPane();
        lstColor = new javax.swing.JList();
        jScrollPane3 = new javax.swing.JScrollPane();
        tblResult = new javax.swing.JTable();
        rdGarde6 = new javax.swing.JRadioButton();
        rdGarde7 = new javax.swing.JRadioButton();
        rdGarde8 = new javax.swing.JRadioButton();
        rdGarde9 = new javax.swing.JRadioButton();
        btnOK = new javax.swing.JButton();
        btnReset = new javax.swing.JButton();
        btnNameAddress = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        lblName.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblName.setText("Name: ");
        lblName.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblNameMouseClicked(evt);
            }
        });

        lblAddress.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblAddress.setText("Address: ");
        lblAddress.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblAddressMouseClicked(evt);
            }
        });

        lblFees.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblFees.setText("Fees: ");
        lblFees.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblFeesMouseClicked(evt);
            }
        });

        lblGrade.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblGrade.setText("Grade: ");
        lblGrade.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblGradeMouseClicked(evt);
            }
        });

        lblColor.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblColor.setText("Color: ");
        lblColor.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblColorMouseClicked(evt);
            }
        });

        lblResult.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblResult.setText("Result: ");
        lblResult.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblResultMouseClicked(evt);
            }
        });

        txtName.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N

        txaAddress.setColumns(20);
        txaAddress.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        txaAddress.setRows(5);
        jScrollPane1.setViewportView(txaAddress);

        cbFees.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        cbFees.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "<Select>", "300.000d", "400.000d", "500.000d", "600.000d" }));

        lstColor.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lstColor.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "White", "Black", "Blue", "Red", "Green" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jScrollPane2.setViewportView(lstColor);

        tblResult.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        tblResult.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"First", "Third", "Third", "Second"},
                {"Second", "Second", "First", "Third"},
                {"Third", "First", "Third", "First"},
                {"First", "Second", "Second", "Second"}
            },
            new String [] {
                "Grade 6", "Grade 7", "Grade 8", "Grade 9"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane3.setViewportView(tblResult);

        grpGrade.add(rdGarde6);
        rdGarde6.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        rdGarde6.setText("Grade 6");

        grpGrade.add(rdGarde7);
        rdGarde7.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        rdGarde7.setText("Grade 7");

        grpGrade.add(rdGarde8);
        rdGarde8.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        rdGarde8.setText("Grade 8");

        grpGrade.add(rdGarde9);
        rdGarde9.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        rdGarde9.setText("Grade 9");

        btnOK.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        btnOK.setText("OK");
        btnOK.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnOKActionPerformed(evt);
            }
        });

        btnReset.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        btnReset.setText("Reset");
        btnReset.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnResetActionPerformed(evt);
            }
        });

        btnNameAddress.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        btnNameAddress.setText("Name & Address");
        btnNameAddress.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNameAddressActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(lblGrade)
                        .addGap(32, 32, 32)
                        .addComponent(rdGarde6)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rdGarde7)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rdGarde8)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rdGarde9))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lblName)
                            .addComponent(lblAddress)
                            .addComponent(lblFees)
                            .addComponent(lblColor)
                            .addComponent(lblResult))
                        .addGap(10, 10, 10)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                            .addComponent(jScrollPane2)
                            .addComponent(cbFees, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jScrollPane1)
                            .addComponent(txtName)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(btnOK)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnNameAddress)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnReset)
                                .addGap(55, 55, 55)))))
                .addContainerGap(12, Short.MAX_VALUE))
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btnOK, btnReset});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtName)
                    .addComponent(lblName))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblAddress)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblFees)
                    .addComponent(cbFees, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblColor)
                        .addGap(76, 76, 76))
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(7, 7, 7)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblResult)
                    .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(8, 8, 8)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblGrade)
                    .addComponent(rdGarde6)
                    .addComponent(rdGarde7)
                    .addComponent(rdGarde8)
                    .addComponent(rdGarde9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnReset)
                    .addComponent(btnOK)
                    .addComponent(btnNameAddress))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    private void lblNameMouseClicked(java.awt.event.MouseEvent evt) {
        if(validate.validateControl(txtName, this)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    private void lblAddressMouseClicked(java.awt.event.MouseEvent evt) {
        if(validate.validateControl(txaAddress, this)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    private void lblFeesMouseClicked(java.awt.event.MouseEvent evt) {
        if(validate.validateControl(cbFees, this)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    private void lblColorMouseClicked(java.awt.event.MouseEvent evt) {
        if(validate.validateControl(lstColor, this)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    private void lblResultMouseClicked(java.awt.event.MouseEvent evt) {
        if(validate.validateControl(tblResult, this)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    private void lblGradeMouseClicked(java.awt.event.MouseEvent evt) {
        if(validate.validateControl(grpGrade, this)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {
        if(validate.validate(this)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    private void btnResetActionPerformed(java.awt.event.ActionEvent evt) {
        validate.reset();
    }

    private void btnNameAddressActionPerformed(java.awt.event.ActionEvent evt) {
        if(validate.validateControls(this, txtName, txaAddress)){
            JOptionPane.showMessageDialog(this, "No error !");
        }
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
        * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
        */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(DemoValidate.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DemoValidate().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton btnNameAddress;
    private javax.swing.JButton btnOK;
    private javax.swing.JButton btnReset;
    private javax.swing.JComboBox cbFees;
    private javax.swing.ButtonGroup grpGrade;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JLabel lblAddress;
    private javax.swing.JLabel lblColor;
    private javax.swing.JLabel lblFees;
    private javax.swing.JLabel lblGrade;
    private javax.swing.JLabel lblName;
    private javax.swing.JLabel lblResult;
    private javax.swing.JList lstColor;
    private javax.swing.JRadioButton rdGarde6;
    private javax.swing.JRadioButton rdGarde7;
    private javax.swing.JRadioButton rdGarde8;
    private javax.swing.JRadioButton rdGarde9;
    private javax.swing.JTable tblResult;
    private javax.swing.JTextArea txaAddress;
    private javax.swing.JTextField txtName;
    // End of variables declaration
    Validate validate;
}
 
  • Like
Reactions: JackV and LTV

LTV

Active Member
11/12/12
320
79
28
Bắc Giang
itube-v3.appspot.com
Mình cũng vừa làm project xong, gặp ngay vấn đề validate mà lười quá gặp ngay bài này.
Có bảng các validate hỗ trợ không bạn, cho dễ nhìn không giờ đọc tìm lâu lắm á :D
Ủa mà toàn bắt empty không thôi à bạn
 
26/4/13
88
24
8
Mình cũng vừa làm project xong, gặp ngay vấn đề validate mà lười quá gặp ngay bài này.
Có bảng các validate hỗ trợ không bạn, cho dễ nhìn không giờ đọc tìm lâu lắm á :D
Ủa mà toàn bắt empty không thôi à bạn
à, các phương thức em có viết javadoc hết rồi mà.
HỖ TRỢ: JTextField, JTextArea, JComboBox, JTable, JList, JRadioButton, JPasswordField, ...(sẽ còn cập nhật thêm)
Lớp này bắt được empty và RegEx (vẫn sẽ còn cập nhật thêm :) ), em có cho một số RegEx mẫu như kiểm tra số nguyên, số nguyên âm-dương, số thực, số thực âm-dương, email nữa
Empty với RegEx là buid-in, anh có thể tự viết phương thức kiểm tra bằng cách hiện thực lớp Validate Function(em có ví dụ: Address phải bắt đầu bằng P, kết thúc bằng m). thật ra mấy cái này RegEx bắt hết được mà
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,640
307
83
Dùng thôi mà phải push nhìu quá nhỉ??
Rồi giờ đang gõ form, gõ ko đúng cái hiện lên cái pop-up, phiền phức quá, nếu developer muốn chỉ hiện đoạn label bôi đỏ thông báo nhập sai thì sao?
Rồi giờ ko muốn hiển thị "is not valid" nữa, giờ muốn hiển thị cái gì sting dâu hơn xíu, ví dụ như "Bạn hiền à, bạn đã nhập sai rồi, làm lại nhé ^^" vậy thì sao
Nếu trong trường hợp người dùng ko hiểu tiếng anh và cần dùng multi-lang thì sao?
Có cách nào chỉ cần push cái component, message với regExp là hết rồi ko ? :)
 
26/4/13
88
24
8
Sửa lại method thôi ;))
chuẩn luôn ^^

Dùng thôi mà phải push nhìu quá nhỉ??
Rồi giờ đang gõ form, gõ ko đúng cái hiện lên cái pop-up, phiền phức quá, nếu developer muốn chỉ hiện đoạn label bôi đỏ thông báo nhập sai thì sao?
Rồi giờ ko muốn hiển thị "is not valid" nữa, giờ muốn hiển thị cái gì sting dâu hơn xíu, ví dụ như "Bạn hiền à, bạn đã nhập sai rồi, làm lại nhé ^^" vậy thì sao
Nếu trong trường hợp người dùng ko hiểu tiếng anh và cần dùng multi-lang thì sao?
Có cách nào chỉ cần push cái component, message với regExp là hết rồi ko ? :)
Em làm cho đơn giản, muốn lấy thông báo thôi thì dùng String getErrorMessage();
PHP:
    /**
    * Kiểm tra lỗi và trả về thông báo lỗi (nếu có)
    * toàn bộ control có khai báo trong contrustor
    *
    * @return
    * - Rỗng nếu không có lỗi<br/>
    * - Chuỗi thông báo lỗi nếu có lỗi
    */
    public String getErrorMessage(){
        String errorMessage = "";
        for (int i = 0; i < objectToValidate.length; i++) {
            Object[] arrObject = objectToValidate[i];
            Object control = arrObject[0];
            String controlName = arrObject[1].toString();
            String messageControl;

            if(arrObject.length > 2){
                Object[] arrObjectTemp = new Object[arrObject.length - 2];
                System.arraycopy(arrObject, 2, arrObjectTemp, 0, arrObject.length - 2);
                messageControl = getErrorMessageControl(control, controlName, arrObjectTemp);
            }else{
                messageControl = getErrorMessageControl(control, controlName);
            }
            errorMessage += messageControl;
        }
        return errorMessage;
    }
à, anh nói push nhiều là sao? Dùng cái này chỉ cần khai báo và gọi đối_tượng.validate(this) là được mà
 
26/4/13
88
24
8
Thì dùng mà phải push thêm nhiều phần nữa mới đủ dùng ấy, ít nữa nó nhiều lên chắc chả nhớ nổi tên phương thức
chỉ có validate(this) getErrorMessage() thôi mà!
ngoài ra thì còn getText(int), setText(int, String), setEnabled(int, boolean), setEditable(int, boolean)
còn lấy ValidateFunction thì chĩ có
static ValidateFunction getRequestValidate() và
static ValidateFunction getRegExValidate(String regEx, String format)
thôi mà
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,640
307
83
Tức là lúc khởi tạo validate, chỉ cần bỏ vào Component, errorMessage và Validator(Validator này đc kế thừa bởi ExRegValidator hoặc OtherValidate: như combobox thì ko đc chọn vị trí đầu tiên chẳng hạn), mình thấy cái Validator này bạn làm khá tốt.
Nhưng khởi tạo với cái Name của component thì ko cần thiết lắm, sửa lại thành errorMessage cho bao quát.
 
26/4/13
88
24
8
Tức là lúc khởi tạo validate, chỉ cần bỏ vào Component, errorMessage và Validator(Validator này đc kế thừa bởi ExRegValidator hoặc OtherValidate: như combobox thì ko đc chọn vị trí đầu tiên chẳng hạn), mình thấy cái Validator này bạn làm khá tốt.
Nhưng khởi tạo với cái Name của component thì ko cần thiết lắm, sửa lại thành errorMessage cho bao quát.
à, cái name, ví dụ như "Name", "Address" là để hiện thông báo lỗi, như "Name is empty !", "You are not select Address", như vậy thông báo sẽ cụ thể hơn, còn nếu không có name thì không lẽ nó thông báo có một câu "You have not entered enough information !" - người dùng khong biết là sai cái j(nếu là lỗi bắt buộc thì ko nói, nếu là những lỗi đặc biệt như tuổi phải > 18, mã nhân viên phải bắt đầu bằng "E" thì làm sao người dùng biết), còn nếu nhập nguyên thông báo lỗi thì khởi tạo sẽ dài dòng, phải copy-paste nhiều. Em sẽ cải tiến để có thể sử dụng đa ngôn ngữ