我想设置TextField可以使用的最大条目数,我用过:
setMaximumSize
setPreferredWidth
SetColumns
但未能这样做。我怎么能完成它?
这是我的代码:
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {
public static void main(String args[]){
JFrame jfrm = new JFrame("Sample program");
Container Content = jfrm.getContentPane();
content.setBackground(Color.red);
jfrm.setLayout(null);
jfrm.setBounds(250, 150, 400, 400);
JTextField text = new JTextField();
Font font1 = new Font("Courier",Font.BOLD,12);
text.setFont(font1);
text.setBounds(50, 15, 100, 30);
JButton button1 = new JButton("PROGRAM");
button1.setFont(font1);
button1.setBounds(250, 15, 100, 40);
button1.setBackground (Color.white);
JButton button3 = new JButton("EXIT");
button3.setBounds(250, 115, 100, 40);
button3.setBackground (Color.cyan);
button1.setForeground (Color.red);
JButton button2 = new JButton("USER");
button2.setBounds(250, 65, 100, 40);
button2.setBackground (Color.WHITE);
jfrm.add(button1);
jfrm.add(button2);
jfrm.add(button3);
jfrm.add(text);
jfrm.setVisible(true);
jfrm.setResizable(false);
}
}
答案 0 :(得分:5)
使用DocumentFilter
,如本教程中所述Oracle doc filter tutorial
以下是我最近用来限制框中最大条目大小和字符类的内容:
class SizeAndRegexFilter extends DocumentFilter {
private int maxSize;
private String regex;
SizeAndRegexFilter (int maxSize,String regex) {
this.maxSize=maxSize;
this.regex=regex;
}
public void insertString(FilterBypass fb, int offs,String str, AttributeSet a) throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()) <= maxSize && str.matches(regex))
super.insertString(fb, offs, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
public void replace(FilterBypass fb, int offs,int length, String str, AttributeSet a) throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()
- length) <= maxSize && str.matches(regex))
super.replace(fb, offs, length, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
}
您也可以在离开输入字段之前使用InputVerifier
检查输入。
(提示:如何确保输入完全 n个字符?)
答案 1 :(得分:2)
文本字段本身不限制文本的长度。要获得您想要的内容,您必须通过调用setDocument()
或将其传递给构造函数来为文本字段提供不同的文档。
您的文档将是javax.swing.text.Document
的实例,例如javax.swing.text.PlainDocument
的子类。然后覆盖public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
方法。
Swing似乎有FixedLengthDocument
,但这是HTMLDocument
的私有静态内部类。但是,为了帮助您入门,这是该类源代码的相关部分:
public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
if (str != null && str.length() + getLength() <= maxLength) {
super.insertString(offset, str, a);
}
}
答案 2 :(得分:2)
除了使用托马斯建议的其他Document
之外,您还可以使用FormattedTextField。可能会更容易。
答案 3 :(得分:1)
为了你的工作,我修改了你的程序,看看:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class ButtonDemo extends JFrame {
public static void main(String args[]){
JFrame jfrm = new JFrame("Sample program");
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrm.setLocationByPlatform(true);
Container content = jfrm.getContentPane();
content.setBackground(Color.red);
jfrm.setLayout(null);
jfrm.setBounds(250, 150, 400, 400);
JTextField text = new JTextField();
Font font1 = new Font("Courier",Font.BOLD,12);
text.setFont(font1);
text.setBounds(50, 15, 100, 30);
AbstractDocument abdoc;
Document doc = text.getDocument();
if (doc instanceof AbstractDocument)
{
abdoc = (AbstractDocument) doc;
abdoc.setDocumentFilter(new DocumentSizeFilter(4));
}
JButton button1 = new JButton("PROGRAM");
button1.setFont(font1);
button1.setBounds(250, 15, 100, 40);
button1.setBackground (Color.white);
JButton button3 = new JButton("EXIT");
button3.setBounds(250, 115, 100, 40);
button3.setBackground (Color.cyan);
button1.setForeground (Color.red);
JButton button2 = new JButton("USER");
button2.setBounds(250, 65, 100, 40);
button2.setBackground (Color.WHITE);
jfrm.add(button1);
jfrm.add(button2);
jfrm.add(button3);
jfrm.add(text);
jfrm.setVisible(true);
jfrm.setResizable(false);
}
}
class DocumentSizeFilter extends DocumentFilter {
private int max_Characters;
private boolean DEBUG;
public DocumentSizeFilter(int max_Chars) {
max_Characters = max_Chars;
DEBUG = false;
}
public void insertString(FilterBypass fb
, int offset
, String str
, AttributeSet a)
throws BadLocationException {
if (DEBUG) {
System.out.println("In DocumentSizeFilter's insertString method");
}
if ((fb.getDocument().getLength() + str.length()) <= max_Characters)
super.insertString(fb, offset, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
public void replace(FilterBypass fb
, int offset, int length
, String str, AttributeSet a)
throws BadLocationException {
if (DEBUG) {
System.out.println("In DocumentSizeFilter's replace method");
}
if ((fb.getDocument().getLength() + str.length()
- length) <= max_Characters)
super.replace(fb, offset, length, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
}
只需在此添加abdoc.setDocumentFilter(new DocumentSizeFilter(4));
JTextField
所需的最大字符数。用您选择的任意数字替换4。
希望这可能会有所帮助。
此致
答案 4 :(得分:0)
问题是您的布局管理器仍在负责布局,因此,setMaximumSize setPreferredWidth不起作用。
要在开始时修复此问题,您需要将布局管理器设置为null。
jfrm.setLayout(null);
虽然通过这样做,您将需要使用组件的绝对定位。
另见 Java, Swing: how do I set the maximum width of a JTextField?