RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 656324
Accepted
Lezenford
Lezenford
Asked:2020-04-21 01:47:15 +0000 UTC2020-04-21 01:47:15 +0000 UTC 2020-04-21 01:47:15 +0000 UTC

在 jTextField 中设置文本

  • 772

有问题。摆动界面。它有几个 jtexfield 形状。以下是关于表格的内容:

portTextField.setDocument(new PortDocument()); //устанавливаем ограничение на ввод в поле

private static class PortDocument extends PlainDocument { //класс для ограничения длинны ввода для порта
        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            String chars = "0123456789";
            if (chars.contains(str)) {
                if (getLength() < 5) { //порт не более 5 символов (0-65535)
                    super.insertString(offs, str, a);
                }
            }
        }
    }

在这里,当尝试做

portTextField.setText(String.valueOf(port));

运行后值不会出现在字段中。尽管传输了数字,但在本文档中,输入是完全允许的。问题。如何限制字段只能输入数字且长度不能超过5,同时又能通过代码向该字段插入值?

下面是完整的代码:

 public SettingFrame(String host, int port, int start, int end) /*throws HeadlessException*/ { //конструктор окна со считанными параметрами
        jFrame = this; //устанавливаем соответсвие для удобства
        hostTextField.setText(host); //устанавливаем значение хоста
        portTextField.setText(String.valueOf(port)); //устанавливаем значение порта
        if (start ==0 && end == 0) { //если режим ND не активирован
            availableDB.setSelected(false);
            startNDTextField.setEnabled(false);
            endNDTextField.setEnabled(false);
        }else { //если режим ND активирован
            availableDB.setSelected(true);
            startNDTextField.setEnabled(true);
            endNDTextField.setEnabled(true);
            startNDTextField.setText(String.valueOf(start));
            endNDTextField.setText(String.valueOf(end));
        }
        init(); //инициируем


 private void init() { //инициация. Общая для обоих конструкторов
        jFrame.add(rootPanel); //добавляем к фрейму панель
        startNDTextField.setDocument(new NDDocument()); //устанавливаем ограничение на ввод в поле
        endNDTextField.setDocument(new NDDocument()); //устанавливаем ограничение на ввод в поле
        portTextField.setDocument(new PortDocument()); //устанавливаем ограничение на ввод в поле
        this.pack(); //устанавливаем размеры
        this.setLocationRelativeTo(null); //перемещаем окно в центр рабочего стола
        this.setResizable(false); //запрещаем изменять размер окна
        this.setVisible(true); //отображаем окно
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //устанавливаем функцию кнопки закрытия - выход из программы
...

最小足够的自我复制方法是:

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


public class Test {
    public static void main(String[] args) {
        JTextField jTextField = new JTextField();
        jTextField.setText("12");
        System.out.println(jTextField.getText().length());
        jTextField.setDocument(new PortDocument());
        System.out.println(jTextField.getText().length());

    }

    private static class PortDocument extends PlainDocument { //класс для ограничения длинны ввода для порта
        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            String chars = "0123456789";
            if (chars.contains(str)) {
                if (getLength() < 5) { //порт не более 5 символов (0-65535)
                    super.insertString(offs, str, a);
                }
            }
        }
    }


}
swing
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Mikhail Vaysman
    2020-04-21T02:13:13Z2020-04-21T02:13:13Z

    在设置setDocument之后设置值。因为setDocument抛出了旧值。

    在您的情况下,调用portTextField.setText(String.valueOf(port))应该在 之后init()。

    该值必须在设置文档后设置。

    public class Test {
        public static void main(String[] args) {
            JTextField jTextField = new JTextField();
            System.out.println(jTextField.getText().length());
            // устанавливаете документ
            jTextField.setDocument(new PortDocument());
            // устанавливаете значение
            jTextField.setText("12");
            System.out.println(jTextField.getText().length());
        }
    
        private static class PortDocument extends PlainDocument { //класс для ограничения длинны ввода для порта
            @Override
            public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
                String chars = "0123456789";
                if (chars.contains(str)) {
                    if (getLength() < 5) { //порт не более 5 символов (0-65535)
                        super.insertString(offs, str, a);
                    }
                }
            }
        }
    }
    
    • 0
  2. Lezenford
    2020-04-21T03:55:34Z2020-04-21T03:55:34Z

    找到了解决方案。文档格式如下:

    private static class PortDocument extends PlainDocument { //класс для ограничения длинны ввода для порта
            @Override
            public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
                String chars = "0123456789";
                for (int i = 0; i < str.length(); i++) {
                    if (!chars.contains(str.substring(i, i + 1))) return;
                }
                if (getLength() < 5) { //порт не более 5 символов (0-65535)
                    super.insertString(offs, str, a);
                }
            }
        }
    

    现在检查并正确设置

    • -1

相关问题

  • 当您运行 repaint() 命令时,将绘制整个框架来代替小面板

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5