package edu.gui.components; import edu.parser.QL.nodes.question.Question; import javax.swing.*; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; import javax.swing.text.PlainDocument; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; /** * Created by Steven Kok on 25/02/2015. */ public class NumberBox extends AbstractBox implements FocusListener { private final JTextField textField; public NumberBox(Question question) { super(question); textField = new JTextField(); textField.setDocument(getPlainDocument()); textField.addFocusListener(this); textField.setColumns(15); initialize(); } private PlainDocument getPlainDocument() { PlainDocument plainDocument = new PlainDocument(); plainDocument.setDocumentFilter(new DocumentFilter() { @Override public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) throws BadLocationException { fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove non-digits } @Override public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) throws BadLocationException { fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove non-digits } }); return plainDocument; } @Override public void removeEventListeners() { textField.removeFocusListener(this); } public void initialize() { textField.setText(getQuestion().getValue().getValue()); if (computedQuestion(getQuestion())) { textField.setEditable(false); this.removeEventListeners(); } } @Override public void focusGained(FocusEvent e) { } @Override public void focusLost(FocusEvent e) { notifyObservers(); } @Override public void notifyObservers() { getObservers().stream() .forEach(observer -> observer.update(this)); } @Override public JComponent getComponent() { return textField; } public String getText() { return textField.getText(); } }