如何爲用戶設置輸入限制,我的意思是用戶只能輸入2或4個整數而不能輸入。將限制整數設置爲JTextField
代碼:
JLabel dateD = new JLabel("| Date Day:");
dateD.setBounds(170,270, 120, 25);
dateDD = new JTextField();
dateDD.setBounds(235,270, 20, 25);
如何爲用戶設置輸入限制,我的意思是用戶只能輸入2或4個整數而不能輸入。將限制整數設置爲JTextField
代碼:
JLabel dateD = new JLabel("| Date Day:");
dateD.setBounds(170,270, 120, 25);
dateDD = new JTextField();
dateDD.setBounds(235,270, 20, 25);
使用DocumentFilter
應排在你出去,創建過濾器如下: -
class MaximumCharacters extends DocumentFilter {
private int maxLength;
public MaximumCharacters() {
maxLength = 10; // The number of characters allowed
}
@Override
public void insertString(FilterBypass fb, int offset, String string,
AttributeSet attr) throws BadLocationException {
if (maxLength > 0
&& fb.getDocument().getLength() + string.length() <= maxLength) {
super.insertString(fb, offset, string, attr);
}
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
if ((fb.getDocument().getLength() + text.length() - length) <= maxLength)
super.replace(fb, offset, length, text, attrs);
}
}
然後,設置DocumentFilter
您JTextField
組件,如下所示: -
((AbstractDocument) dateDD.getDocument()).setDocumentFilter(new MaximumCharacters());
+ 1爲DocumentFilter。請參閱Swing教程[實現文檔過濾器](http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter)獲取更多信息。 – camickr 2013-03-26 18:21:29
您能否解釋一下更多如何使用DocumentFilter? – 2013-03-26 18:22:01
可能我是愚蠢的......但我無法得到如何實施這種方法給我...... – 2013-03-26 18:28:18
對於下面的答案是一個Util爲了處理上述情況而創建的方法 -
/**
* Method installNumericMaximumCharacters.
*
* @param document
* AbstractDocument
* @param numberofChars
* int
*/
public static void installNumericMaximumCharacters(
AbstractDocument document, final int numberofChars) {
document.setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset,
String string, AttributeSet attr)
throws BadLocationException {
try {
if (string.equals(".")
&& !fb.getDocument()
.getText(0, fb.getDocument().getLength())
.contains(".")) {
super.insertString(fb, offset, string, attr);
return;
}
Double.parseDouble(string);
if (fb.getDocument().getLength() + string.length() <= numberofChars) {
super.insertString(fb, offset, string, attr);
} else {
Toolkit.getDefaultToolkit().beep();
}
} catch (Exception e) {
Toolkit.getDefaultToolkit().beep();
}
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs)
throws BadLocationException {
try {
if (text.equals(".")
&& !fb.getDocument()
.getText(0, fb.getDocument().getLength())
.contains(".")) {
super.insertString(fb, offset, text, attrs);
return;
}
Double.parseDouble(text);
int l = fb.getDocument().getLength() - length
+ text.length();
if (length > 0) {
fb.getDocument().remove(offset, length);
}
if (l <= numberofChars) {
super.insertString(fb, offset, text, attrs);
} else {
Toolkit.getDefaultToolkit().beep();
}
} catch (Exception e) {
Toolkit.getDefaultToolkit().beep();
}
}
});
}
該方法有點自我解釋。當Document
發生變化時,它會喚起DocumentFilter
。請注意,您不能setText()
相同Document
。你將不得不爲它使用FilterBypass
對象。
請勿使用'setBounds()'來設置組件的大小/位置。 Swing旨在與[佈局管理器](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)一起使用。 – camickr 2013-03-26 18:20:20
我知道,你不是第一個告訴我使用LayoutManager的人,我需要使用這種方法....問題是如何使用這種方法固定INT,我已經使用.......(( ( – 2013-03-26 18:23:28
那麼,爲什麼你繼續尋求幫助,如果你忽略給出的建議? – camickr 2013-03-26 19:57:26