Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 如何在JTextField中设置不同的限制以显示输入提示和输入_Java_Swing_Jtextfield_Focuslistener - Fatal编程技术网

Java 如何在JTextField中设置不同的限制以显示输入提示和输入

Java 如何在JTextField中设置不同的限制以显示输入提示和输入,java,swing,jtextfield,focuslistener,Java,Swing,Jtextfield,Focuslistener,我想定制一个JTextField,我的要求是: 在文本字段中显示提示 它将使用有限的字符数 这两个要求都起作用了。但问题是,如果我将限制设置为6,那么它会将输入长度设置为6。我需要设定一个额外的限制 比如,输入提示限制:20,数字输入限制:6 示例:输入提示:在此处输入数字,输入:666666(最多6位) 这是两位同学 CustomTextField.java CustomJTextFieldCharLimit.java 公共类CustomJTextFieldCharLimit扩展了明文{ 私有

我想定制一个JTextField,我的要求是:

  • 在文本字段中显示提示
  • 它将使用有限的字符数
  • 这两个要求都起作用了。但问题是,如果我将限制设置为6,那么它会将输入长度设置为6。我需要设定一个额外的限制

    比如,输入提示限制:20,数字输入限制:6 示例:输入提示:在此处输入数字,输入:666666(最多6位)

    这是两位同学

    CustomTextField.java

    CustomJTextFieldCharLimit.java

    公共类CustomJTextFieldCharLimit扩展了明文{
    私有整数限制;
    公共客户JTextFieldCharLimit(整数限制){
    这个极限=极限;
    }
    public void insertString(int offset、String String、AttributeSet set)引发BadLocationException{
    if(字符串==null){
    返回;
    
    }否则,如果((getLength()+string.length())尝试重写
    CustomTextField
    类的
    paintComponent(Graphics Graphics)
    方法。这将有助于在没有输入时重新绘制文本字段

    下面是一个示例实现:

    只需将这段代码添加到
    CustomTextField.java
    文件中

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
    
        if (hint.isEmpty() || getText().isEmpty() == false) {
            return;
        }
    
        final Graphics2D g = (Graphics2D) graphics;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(getDisabledTextColor());
        g.drawString(hint, getInsets().left, graphics.getFontMetrics().getMaxAscent() + getInsets().top);
    }
    
    希望这有帮助


    好的,我会在几分钟内检查DocumentFilter

    您尚未更改代码?DocumentFilter是首选方法,因为它是可重用的。您可以将其添加到任何文档中,以便它适用于JTextField、JTextArea和JTextPane

    这两个要求都有效。但问题是,如果我将限制设置为6,那么它会将输入长度设置为6。我需要设置一个额外的限制


    您需要使用不同的方法。例如,您可以使用该类。提示独立于实际文本,因此长度可以不同。

    我检查了它是否正常工作,您是如何检查FocusListener是否正常工作的?不要使用自定义文档,这是一种旧方法。较新的方法是使用
    DocumentFilter
    。签出举个工作示例。我刚刚创建了CustomTextField对象,在那里我看不到提示。我正在使用focus listener在文本框中显示提示。好的,我将在几分钟后检查DocumentFilter。我编辑了我的问题,请您再次检查,并为我提供解决方案。提前谢谢。
    public class CustomJTextFieldCharLimit extends PlainDocument{
        private int limit;
    
        public CustomJTextFieldCharLimit(int limit) {
            this.limit = limit;
        }
    
        public void insertString(int offset, String string, AttributeSet set) throws BadLocationException {
            if (string == null) {
                return ;
            }else if ((getLength() + string.length()) <= limit) {
                super.insertString(offset, string, set);
            }
        }
    }
    
    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
    
        if (hint.isEmpty() || getText().isEmpty() == false) {
            return;
        }
    
        final Graphics2D g = (Graphics2D) graphics;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(getDisabledTextColor());
        g.drawString(hint, getInsets().left, graphics.getFontMetrics().getMaxAscent() + getInsets().top);
    }