001    package market.swing;
002    
003    import javax.swing.JTextField;
004    
005    import market.ValueChecker;
006    
007    /**
008     * A text field, which is provided with an ID that makes it possible to query its contents from outside
009     * the defining class, without the need to write a get-method or even have the text field declared as
010     * public.<br>
011     * Furthermore, a {@link ValueChecker} is assigned, so that the text field's content can be easily checked
012     * for validity. This results in a huge reduction of redundant code that would be necessary when checking
013     * every text field manually.
014     * A JTFCheckable, however, works only in connection with a {@link market.stdform.FSCheckable}.
015     */
016    public class JTFCheckable extends JTextField {
017    
018        /**
019             * ID for serialization.
020             */
021            private static final long serialVersionUID = -499475729615879902L;
022            
023            private ValueChecker chk;
024        private int id;
025    
026        /**
027         * @param id the ID of the JTFCheckable. Every ID must be unique to make sure the {@link market.stdform.FSCheckable}
028         * works properly.
029         * @param chk the ValueChecker for this JTFCheckable. It must not be <code>null</code>. If no checking
030         * is desired, use {@link market.VCDummy} instead.
031         * @param size the size of the JTFCheckable.
032         */
033        public JTFCheckable(int id, ValueChecker chk, int size) {
034            super(size);
035            this.id = id;
036            this.chk = chk;
037        }
038    
039        /**
040         * @param id the ID of the JTFCheckable. Every ID must be unique to make sure the {@link market.stdform.FSCheckable}
041         * works properly.
042         * @param chk the ValueChecker for this JTFCheckable.
043         * @param str the content of the JTFCheckable right after creation.
044         * @param size the size of the JTFCheckable.
045         */
046        public JTFCheckable(int id, ValueChecker chk, String str, int size) {
047            super(str, size);
048            this.id = id;
049            this.chk = chk;
050        }
051    
052        /**
053         * Checks the text field's content for validity with the help of the assigned {@link ValueChecker}.
054         *
055         * @return <code>true</code> if the content is valid, otherwise <code>false</code>.
056         */
057        public boolean hasValidValue() {
058            return chk.isValidValue(this.getText());
059        }
060    
061        /**
062         * Asks the {@link ValueChecker} for an error message according to the kind of error.
063         * @return the picked error message.
064         */
065        public String getErrorMessage() {
066            return chk.getErrorString();
067        }
068    
069        /**
070         * @return the ID.
071         */
072        public int getID() {
073            return id;
074        }
075    }