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