Controlling content of text field
Hello,
I need to control content of text field in Swing.
I mean:
- user may enter only digits (0-9) and no other characters,
- there may by no more than 4 digits in text field,
- if value in text field is smaller than 50 or greater than 500,
background of text field should become red -- if value
it correct, background should be green.
All checkings should take place "on-line" (after each new
character(s) or after deleting of character(s)).
I created two working examples with use of a) JTextField
and b) JFormattedTextField.
I just wonder if there is some other (better) way to solve
my problem...?
Since I am new to Swing, I wish to learn correct methods
of solving basic problems. So, please tell me if my code is
good, and what are other possibilities. Thanks in advance!
Regards,
Robbo
------------------------
a)
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
public class Swing {
public static void main(String[] args) {
new Swing();
}
private static final int MIN = 50;
private static final int MAX = 500;
private static final int MAX_CHARS = 4;
JTextField tf1 = null;
public Swing() {
JFrame f = new JFrame("Swing...");
f.setSize(300, 120);
Container c = f.getContentPane();
c.setLayout(new FlowLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tf1 = new JTextField(10);
MyDocument md = new MyDocument();
tf1.setDocument(md);
md.addDocumentListener(new MyDocumentListener());
c.add(tf1);
f.setVisible(true);
}
class MyDocument extends PlainDocument {
@Override
public void insertString(int ofs, String str,
javax.swing.text.AttributeSet a)
throws
javax.swing.text.BadLocationException {
if (str == null)
return;
char[] t = new char[str.length()];
int l = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (Character.isDigit(c))
t[l++] = c;
}
if ((str.length() != l) || (ofs >= MAX_CHARS)) {
Toolkit.getDefaultToolkit().beep();
l = 0;
}
super.insertString(ofs, new String(t, 0, l), a);
}
}
class MyDocumentListener implements DocumentListener {
public void changedUpdate(DocumentEvent e) { }
public void insertUpdate(DocumentEvent e) {
funct();
}
public void removeUpdate(DocumentEvent e) {
funct();
}
private void funct() {
int i = 0;
try {
i = Integer.valueOf(tf1.getText());
} catch (NumberFormatException e) {
tf1.setBackground(Color.red);
return;
}
if ((i < MIN) || (i > MAX)) {
tf1.setBackground(Color.red);
} else
tf1.setBackground(Color.green);
}
}
}
------------------------
b)
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
public class Swing {
public static void main(String[] args) {
new Swing();
}
private static final int MIN = 50;
private static final int MAX = 500;
JFormattedTextField ftf1 = null;
public Swing() {
JFrame f = new JFrame("Swing...");
f.setSize(250, 100);
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
ftf1 = new JFormattedTextField(new MaskFormatter("####"));
} catch (java.text.ParseException e) {
System.exit(1);
}
ftf1.getDocument().addDocumentListener(new MyDocumentListener());
c.add(ftf1);
f.setVisible(true);
}
class MyDocumentListener implements DocumentListener {
public void changedUpdate(DocumentEvent e) { }
public void insertUpdate(DocumentEvent e) {
funct();
}
public void removeUpdate(DocumentEvent e) {
funct();
}
private void funct() {
int i = 0;
try {
i = Integer.valueOf(ftf1.getText().trim());
} catch (NumberFormatException e) {
ftf1.setBackground(Color.red);
return;
}
if ((i < MIN) || (i > MAX)) {
ftf1.setBackground(Color.red);
} else
ftf1.setBackground(Color.green);
}
}
}