程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了通过几个曲线球在Swing JTextArea上强制使用最大字符大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决通过几个曲线球在Swing JTextArea上强制使用最大字符?

开发过程中遇到通过几个曲线球在Swing JTextArea上强制使用最大字符的问题如何解决?下面主要结合日常开发的经验,给出你关于通过几个曲线球在Swing JTextArea上强制使用最大字符的解决方法建议,希望对你解决通过几个曲线球在Swing JTextArea上强制使用最大字符有所启发或帮助;

您可以使用DocumentFilter来限制最大大小,请参阅本文档部分,其中提供了您需要的有效示例。

以这个为例,我使用了上面示例文件中的组件:

import java.awt.borderLayout;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

import components.documentSizefilter;

public class Test {

    public static voID main(String[] args) {
        new TestFrame().setVisible(true);
    }

    private static class TestFrame extends JFrame{
        private JTextFIEld textFIEld;
        private DefaultStyleddocument doc;
        private JLabel remaningLabel = new JLabel();

        public TestFrame() {
            setLayout(new borderLayout());

            textFIEld = new JTextFIEld();
            doc = new DefaultStyleddocument();
            doc.setdocumentFilter(new documentSizefilter(500));
            doc.adddocumentListener(new documentListener(){
                @OverrIDe
                public voID changedupdate(documentEvent E) { updateCount();}
                @OverrIDe
                public voID insertupdate(documentEvent E) { updateCount();}
                @OverrIDe
                public voID removeupdate(documentEvent E) { updateCount();}
            });
            textFIEld.setdocument(doc);

            updateCount();

            add(textFIEld, borderLayout.CENTER);
            add(remaningLabel, borderLayout.soUTH);

            setLOCATIOnrelativeTo(null);
            pack();
        }

        private voID updateCount()
        {
            remaningLabel.setText((500 -doc.getLength()) + " characters remaining");
        }
    }
}

解决方法

我正在尝试向Swing JLabel和JTextArea添加功能,例如:

  • 仅允许用户在文本区域中输入500个字符(最大)
  • 标签包含一个字符串消息,告诉用户他们还剩下多少个字符(在每次按键或退格后)
  • 组件初始化时,标签显示为“最多500个字符!”
  • 对于键入的前500个字符,对于键入的每个键击(a-z,A-Z,0-9和标点符号),标签都会读取“剩余x个字符”,这x是它们到达字符前剩余的字符数最多500
  • 键入第500个字符时,标签将读取“剩余0个字符”,并且无法在文本区域中键入其他字符
  • 如果用户键入退格按钮(KeyEvent.VK_BACK_SPACE),他们将“释放”一个字符,并且计数增加。因此,如果他们剩余400个字符,并键入退格键,则标签现在显示为“剩余401个字符”
  • 如果用户突出显示一组字符并对其执行批量命令(例如,退格键,或将突出显示的文本替换为单个字符),则将正确计算剩余的正确字符数,并更新标签。因此,如果他们剩下50个字符,并且突出显示5个字母并按退格键,那么现在他们剩下“ 55个字符”

我有90%的功能都在工作,但是有一些错误,并且不知道如何实现上面的最后一项(突出显示的文本上的批量命令)。这是我所拥有的:

Boolean ignoreInput = false;
int charMax = 500;
JLabel charCntLabel = getLabel();
JTextArea myTextArea = getTextArea();

myTextArea.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent E) {
        return;
    }

    @Override
    public void keyReleased(KeyEvent E) {
        // If we should be ignoring input then set make sure we
        // enforce max character count and remove the newly typed key.
        if(ignoreInput)
            myTextArea.setText(myTextArea.getText().subString(0,myTextArea.getText().length()));
    }

    @Override
    public void keyPressed(KeyEvent E) {
        String charsRemaining = " characters remaining";
        int newLen = 0;

        // The key has just been pressed so Swing hasn't updated
        // the text area with the new KeyEvent.
        int currLen = myTextArea.getText().length();

        // Adjust newLen depending on whether the user just pressed
        // the BACkspace key or not.
        if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
            newLen = currLen - 1;
            ignoreInput = false;
        }
        else
            newLen = currLen + 1;

        if(newLen < 0)
            newLen = 0;

        if(newLen == 0)
            charCntLabel.setText(charMax + " characters maximum!");
        else if(newLen >= 0 && newLen < charMaX)
            charCntLabel.setText((charMax - newLen) + charsRemaining);
        else if(newLen >= charMaX) {
            ignoreInput = true;
            charCntLabel.setText("0 " + charsRemaining);
        }
    }
});

上面的代码运行良好,但是有一些错误:

  • 这不会阻止用户输入> 500个字符。当用户键入第500个字符时,标签将显示“剩余0个字符”。但是之后您可以继续输入字符,并且标签保持不变。
  • 如果您在文本区域中有> 500个字符,并开始退格,您会看到每个字符都已从文本区域(基础模型)中删除,但标签保持不变。 但是 ,一旦退格足够达到第500个字符,并且退格,标签就会开始正确更改,告诉您“剩余1个字符”,“剩余2个字符”等。所以&Hellip;
  • 该代码似乎可以正常工作,但是停止工作> 500个字符。一旦恢复到最大500个字符以内,它将重新开始工作。

问题

  1. 有没有更简单的方法来实现此所需功能(以及用于Swing JTextArea)?我觉得我在这里重新发明轮子,可能会有一种“更清洁”的方法来强制字符最大值并更新它们各自的标签。
  2. 如果没有,是否有人可以发现我的> 500个字符错误?我整个上午都在看,正在拔头发。
  3. 最重要的是 ,我该如何实现处理批量命令以突出显示文本的要求?如何在文本区域内进行文本选择,如何侦听突出显示的文本的更改(例如,使用退格按钮删除多个突出显示的字符等),以及如何正确计算剩余字符的新值?

提前致谢。

大佬总结

以上是大佬教程为你收集整理的通过几个曲线球在Swing JTextArea上强制使用最大字符全部内容,希望文章能够帮你解决通过几个曲线球在Swing JTextArea上强制使用最大字符所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。