我设计了一个带有一些JTextFields的小摆动GUI,但是它有一个validateVariables方法,它必须验证接口内的所有字段,有一个JTextField调用(IP)必须只接受int变量我该如何设置它像那样?
P.S JTextfield是用nette工具创建的。
答案 0 :(得分:2)
只需使用DocumentFilter
即可接受整数。
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class InputInteger
{
private JTextField tField;
private JLabel label=new JLabel();
private MyDocumentFilter documentFilter;
private void displayGUI()
{
JFrame frame = new JFrame("Input Integer Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5));
tField = new JTextField(10);
((AbstractDocument)tField.getDocument()).setDocumentFilter(
new MyDocumentFilter());
contentPane.add(tField);
contentPane.add(label);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args)
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
new InputInteger().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
class MyDocumentFilter extends DocumentFilter{
private static final long serialVersionUID = 1L;
@Override
public void insertString(FilterBypass fb, int off
, String str, AttributeSet attr)
throws BadLocationException
{
// remove non-digits
fb.insertString(off, str.replaceAll("\\D++", ""), attr);
}
@Override
public void replace(FilterBypass fb, int off
, int len, String str, AttributeSet attr)
throws BadLocationException
{
// remove non-digits
fb.replace(off, len, str.replaceAll("\\D++", ""), attr);
}
}
答案 1 :(得分:1)
当我记得正确摆放文本字段时,您可以注册为输入/键盘记录器并在每次按键时验证输入。
答案 2 :(得分:1)
这是JTextField的javadoc http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextField.html
有一个例子
public class UpperCaseField extends JTextField {
public UpperCaseField(int cols) {
super(cols);
}
protected Document createDefaultModel() {
return new UpperCaseDocument();
}
static class UpperCaseDocument extends PlainDocument {
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null) {
return;
}
char[] upper = str.toCharArray();
for (int i = 0; i < upper.length; i++) {
upper[i] = Character.toUpperCase(upper[i]);
}
super.insertString(offs, new String(upper), a);
}
}
}
此示例将所有用户输入更改为大写。 只需修改insertString方法,删除所有非数字字符, 您可以使文本字段仅接受数字。
示例:
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null) {
return;
}
super.insertString(offs, str.replaceAll("[^0-9]", ""), a);
}
----编辑----
正如@MadProgrammer所说,DocumentFilter是另一种方法,例如:
Document document = someJTextField.getDocument();
if (document instanceof AbstractDocument) {
((AbstractDocument) doc).setDocumentFilter(new DocumentFilter() {
public void insertString(DocumentFilter.FilterBypass fb, int offset,
String str, AttributeSet a) throws BadLocationException {
fb.insertString(offset, str.replaceAll("[^0-9]", ""), a);
}
});
}
答案 3 :(得分:1)
使用DocumentFilter
,这就是它的设计目标。
查看Text Component Features,特别是Implementing a Document Filter和here示例