Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java文本字段集字符长度_Java_Swing_Textfield - Fatal编程技术网

Java文本字段集字符长度

Java文本字段集字符长度,java,swing,textfield,Java,Swing,Textfield,在java中,似乎没有办法限制长度。我看了其他例子,人们创建了单独的类等等 我很好奇,我们是否可以在不使用其他类的情况下使用action事件来实现这一点 这是我到目前为止所拥有的 txtTest.addKeyListener(new KeyAdapter() public void keyPressed(KeyEvent e) { int MAX_LEN = 5; char c = e.getKeyChar();

在java中,似乎没有办法限制长度。我看了其他例子,人们创建了单独的类等等

我很好奇,我们是否可以在不使用其他类的情况下使用action事件来实现这一点

这是我到目前为止所拥有的

   txtTest.addKeyListener(new KeyAdapter()
   public void keyPressed(KeyEvent e)
        {
            int MAX_LEN = 5;
            char c = e.getKeyChar();
            int len = txtTest.getText().length();
            if(len < MAX_LEN)
            {
                return;
            }else
            {
                Logging.info("TOOO LONG");
            }

        }
    });
txtest.addKeyListener(新的KeyAdapter()
按下公共无效键(按键事件e)
{
int MAX_LEN=5;
char c=e.getKeyChar();
int len=txtest.getText().length();
如果(长度<最大长度)
{
返回;
}否则
{
Logging.info(“TOOO LONG”);
}
}
});

因此,如果我输入的文本长度超过5个字符,我就达到了这个地步。是否有任何事件,我可以触发,所以如果他们在6字符的类型,它将被删除?例如,模拟退格或删除键?

对不起,这是一个非常脆弱的解决方案,您应该尽可能避免在文本组件上使用KeyListener。例如,当用户尝试复制和粘贴文本时会发生什么情况?我担心在那种情况下,你的代码会失败。避免使用KeyListener还有其他更深层次的原因,但底线是最好使用DocumentFilter

比如说

import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;


@SuppressWarnings("serial")
public class TextTestGui extends JPanel  {
   private JTextField limitedField = new JTextField(10);

   public TextTestGui() {
      add(limitedField);
      PlainDocument doc = (PlainDocument) limitedField.getDocument();
      doc.setDocumentFilter(new MyDocFilter(5));;
   }

   private class MyDocFilter extends DocumentFilter {

      private int limit;

      public MyDocFilter(int limit) {
         this.limit = limit;
      }

      @Override
      public void insertString(FilterBypass fb, int offset, String string,
            AttributeSet attr) throws BadLocationException {
         Document innerDoc = fb.getDocument();
         StringBuilder sb = new StringBuilder(innerDoc.getText(0, innerDoc.getLength()));
         sb.insert(offset, string);
         if (textOK(sb.toString())) {
            super.insertString(fb, offset, string, attr);
         }
      }

      @Override
      public void replace(FilterBypass fb, int offset, int length, String text,
            AttributeSet attrs) throws BadLocationException {
         Document innerDoc = fb.getDocument();
         StringBuilder sb = new StringBuilder(innerDoc.getText(0, innerDoc.getLength()));
         int start = offset; 
         int end = offset + length;
         sb.replace(start, end, text);
         if (textOK(sb.toString())) {
            super.replace(fb, offset, length, text, attrs);
         }
      }

      @Override
      public void remove(FilterBypass fb, int offset, int length)
            throws BadLocationException {
         super.remove(fb, offset, length);
      }

      private boolean textOK(String text) {
         if (text.length() <= limit) {
            return true;
         }
         return false;
      }
   }

   private static void createAndShowGui() {
      TextTestGui mainPanel = new TextTestGui();

      JFrame frame = new JFrame("TextTestGui");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
import javax.swing.*;
导入javax.swing.text.AttributeSet;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.Document;
导入javax.swing.text.DocumentFilter;
导入javax.swing.text.PlainDocument;
@抑制警告(“串行”)
公共类TextTestGui扩展了JPanel{
私有JTextField limitedField=新JTextField(10);
公共文本测试GUI(){
添加(limitedField);
PlainDocument文档=(PlainDocument)limitedField.getDocument();
doc.setDocumentFilter(新的MyDocFilter(5));;
}
私有类MyDocFilter扩展了DocumentFilter{
私有整数限制;
公共MyDocFilter(整数限制){
这个极限=极限;
}
@凌驾
public void insertString(FilterBypass fb、int offset、String String、,
AttributeSet attr)引发BadLocationException{
Document innerDoc=fb.getDocument();
StringBuilder sb=新的StringBuilder(innerDoc.getText(0,innerDoc.getLength());
插入(偏移量、字符串);
if(textOK(sb.toString())){
super.insertString(fb,offset,string,attr);
}
}
@凌驾
public void replace(FilterBypass fb、整数偏移量、整数长度、字符串文本、,
AttributeSet attrs)引发BadLocationException{
Document innerDoc=fb.getDocument();
StringBuilder sb=新的StringBuilder(innerDoc.getText(0,innerDoc.getLength());
int start=偏移量;
int end=偏移量+长度;
替换(开始、结束、文本);
if(textOK(sb.toString())){
super.replace(fb、偏移量、长度、文本、属性);
}
}
@凌驾
公共无效删除(FilterBypass fb、整数偏移量、整数长度)
抛出BadLocationException{
超级。删除(fb、偏移、长度);
}
私有布尔文本OK(字符串文本){

如果(text.length()这是使用keyListener的一种方法:

txtTest.addKeyListener(new KeyAdapter(){
    public void keyPressed(KeyEvent e)
    {
        char[] letters = txtTest.getText().toCharArray();
        if(txtTest.getText().length() < 5)
        {
            return;
        }else
        {
            txtTest.setText(""+letters[0]+letters[1]+letters[2]+letters[3]+letters[4]);
        }
    }
});
txtest.addKeyListener(新的KeyAdapter(){
按下公共无效键(按键事件e)
{
char[]letters=txtest.getText().toCharArray();
if(txtTest.getText().length()<5)
{
返回;
}否则
{
setText(“+字母[0]+字母[1]+字母[2]+字母[3]+字母[4]);
}
}
});
但是,您可以使用while循环来完成:

public void Update(){
    while(true){
        if(txtTest.getText() != null){
            if(!(txtTest.getText().length() < 5))
            {
                char[] letters = txtTest.getText().toCharArray();
                txtTest.setText(""+letters[0]+letters[1]+letters[2]+letters[3]+letters[4]);
            }
        }
    }
}
public void Update(){
while(true){
if(txtest.getText()!=null){
if(!(txtest.getText().length()<5))
{
char[]letters=txtest.getText().toCharArray();
setText(“+字母[0]+字母[1]+字母[2]+字母[3]+字母[4]);
}
}
}
}

不幸的是,这对它来说有点太快,因此需要调整更新速度,这会变得复杂。

如果getText()的前5个字符的子字符串是否使用setText进行子字符串化和设置?是否有办法在同一个类中使用DocumentFilter?@user1158745:当然。只需创建一个匿名内部类或私有内部类,就像您对ActionListener所做的那样。@Compass:它将严格按照您编写的方式运行,不多不少。您能给我一个如何使用DoucmentFilter w的示例吗使用匿名内部类?同样,1)当有人使用复制和粘贴将文本添加到使用您的解决方案的JTextField时会发生什么情况?2)您是否测试了第二个解决方案?您在Swing事件线程上执行此
while(true)
循环时,GUI仍能正常工作?