Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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)限制JTextPane中的字符数_Java_Swing_Jtextpane - Fatal编程技术网

如何根据用户类型(Java)限制JTextPane中的字符数

如何根据用户类型(Java)限制JTextPane中的字符数,java,swing,jtextpane,Java,Swing,Jtextpane,我需要不允许在输入X后输入任何字符。我需要在输入X个字符后发出一声蜂鸣声。我知道在用户按enter键之后如何执行此操作,但我需要在用户按enter键之前执行此操作。我在Oracle网站上找到的方法是向JTextPane添加DocumentSizeFilter。我无法让它在用户检查完后通知用户(直到他们按enter键才起作用)。这是我的一个样本 public class EndCycleTextAreaRenderer extends JTextPane implements TableCellR

我需要不允许在输入X后输入任何字符。我需要在输入X个字符后发出一声蜂鸣声。我知道在用户按enter键之后如何执行此操作,但我需要在用户按enter键之前执行此操作。我在Oracle网站上找到的方法是向JTextPane添加DocumentSizeFilter。我无法让它在用户检查完后通知用户(直到他们按enter键才起作用)。这是我的一个样本

public class EndCycleTextAreaRenderer extends JTextPane
implements TableCellRenderer {

private final int maxNumberOfCharacters = 200;

public EndCycleTextAreaRenderer() {
    StyledDocument styledDoc = this.getStyledDocument();
    AbstractDocument doc;
    doc = (AbstractDocument)styledDoc;
    doc.setDocumentFilter(new DocumentSizeFilter(maxNumberOfCharacters ));

}

我建议通过添加一个来检查每个键输入的字符的#,这是我在最近的GUI中使用的东西,似乎可以立即检查边界,并在用户键入时向用户显示错误

下面是我如何在我的一个文本字段上实现它的:

carbonTextField.addKeyListener(new java.awt.event.KeyAdapter() 
{
        public void keyReleased(java.awt.event.KeyEvent evt) 
        {
            carbonTextFieldKeyReleased(evt);
        }
});
覆盖
JTextPane
中文档的方法,以便在达到最大值后不再插入任何字符

例如:

JTextPane textPane = new JTextPane(new DefaultStyledDocument() {
    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        if ((getLength() + str.length()) <= maxNumberOfCharacters) {
            super.insertString(offs, str, a);
        }
        else {
            Toolkit.getDefaultToolkit().beep();
        }
    }
});
JTextPane textPane=新的JTextPane(新的DefaultStyledDocument(){
@凌驾
public void insertString(int offs、String str、AttributeSet a)引发BadLocationException{

如果((getLength()+str.length())这里有一个示例程序,供您使用,当您第四次在文本窗格中输入时,它将发出嘟嘟声,您甚至不必按enter键:

import javax.swing.*;
导入javax.swing.text.*;
导入java.awt.Toolkit;
公共类TextPaneLimit扩展了JFrame
{
私人JPanel小组;
私人JTextPane;
私人文件abDoc;
公共文本面板限制()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(空);
panel=新的JPanel();
tpane=新的JTextPane();
Document doc=tpane.getStyledDocument();
if(抽象文档的文档实例)
{    
abDoc=(抽象文档)文档;
abDoc.setDocumentFilter(新DocumentSizeFilter(3));
}
面板。添加(tpane);
添加(面板);
包装();
}
公共静态void main(字符串…参数)
{
SwingUtilities.invokeLater(新的Runnable()
{
公开募捐
{
新建TextPaneLimit().setVisible(true);
}
});
}
}
类DocumentSizeFilter扩展了DocumentFilter{
私有int max_字符;
私有布尔调试;
公共文档大小筛选器(int max_Chars){
最大字符数=最大字符数;
调试=错误;
}
public void insertString(FilterBypass)
,整数偏移量
,String str
,属性集a)
抛出BadLocationException{
如果(调试){
System.out.println(“In-DocumentSizeFilter的insertString方法”);
}

如果((fb.getDocument().getLength()+str.length())检查以下代码:

addKeyListener(新的KeyAdapter(){


你是说自定义keyListener吗?我编辑了我的原始帖子,展示了我是如何添加一个keyReleased Listener的。这允许你每次都检查你的边界(基本上允许你在每次按键时进入自己的方法,这将允许你检查是否有蜂鸣声)+1对于您提供的信息,毫无疑问这是好的,但现在将KeyEvents与Swing一起使用通常不是一个好主意。对于keyListener,这是一个错误的方法(不完整且太低级+1,对于较短的方法,我正要通过我的回答告诉他整本圣经,您在一种方法中做了什么:-)Regard我很抱歉成为这样一个noob,但是我在哪里使用这个代码?我的类EndCycleTextAreaRenderer应该覆盖insertString吗?@Boundless检查我的更新,看看你如何更新你的类。@dogbane谢谢你的帮助。我仍然得到同样的行为(用户可以输入任意数量的文本,但当他们按enter键时,文本会被截断)。我在中插入了一个断点,Toolkit.getDefaultToolkit().beep()调用仅在用户按enter键后发生。1用于对文本组件进行子类化(与文档相比,或者更简单地使用DocumentFilter)是的,我在Oracle的网站上尝试了这个例子,但当用户按下一个键时,没有收到想要的哔哔声。@Boundless:请检查这个程序,我刚做的,在这里你不必按任何Enter键就可以发出哔哔声。只需尝试添加第四个字符,它就会发出哔哔声。Regard我尝试了它,它可以根据需要工作。谢谢你,我将尝试使用它我的需要。所以,当我用我的代码实现这个解决方案时,它并没有像预期的那样工作。我肯定缺少一些东西。我的类正被用作TableCellRenderer。这会破坏代码吗?如果是,你知道如何修复它吗?@Boundless:如果你仍然面临问题,我建议你删除我的答案,作为适当的answer或者,再次问这个问题,因为我不确定TableCellRenderer如何阻碍代码流。Regardsa renderer从不发出蜂鸣声;-)请确保您理解renderer与editor的概念
public class EndCycleTextAreaRenderer extends JTextPane implements TableCellRenderer {

    private final int maxNumberOfCharacters = 200;

    public EndCycleTextAreaRenderer() {
        setStyledDocument(new DefaultStyledDocument() {
            @Override
            public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
                if ((getLength() + str.length()) <= maxNumberOfCharacters) {
                    super.insertString(offs, str, a);
                } else {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
        });
    }
}
import javax.swing.*;
import javax.swing.text.*;

import java.awt.Toolkit;

public class TextPaneLimit extends JFrame
{
    private JPanel panel;
    private JTextPane tpane;
    private AbstractDocument abDoc;

    public TextPaneLimit()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        panel = new JPanel();
        tpane = new JTextPane();

        Document doc = tpane.getStyledDocument();
        if (doc instanceof AbstractDocument) 
        {    
            abDoc = (AbstractDocument)doc;
            abDoc.setDocumentFilter(new DocumentSizeFilter(3));
        }

        panel.add(tpane);

        add(panel);
        pack();
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new TextPaneLimit().setVisible(true);
                }
            });
    }
}

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();
   }
}
        @Override
        public void keyTyped(KeyEvent e) {
            if(txtpnDesc.getText().length() == 30)
            {
                e.consume();
            }

        }
    });