【问题标题】:Readonly JFormattedTextField只读 JFormattedTextField
【发布时间】:2013-04-01 01:14:27
【问题描述】:

假设 JFormattedTextField 已启用并包含格式化程序,有没有办法使其只读?使用 JTextField,我们只需要提供一个自定义 Document 并在那里进行所有控制,但是使用 JFormattedTextField 我想事情是稍微复杂一点,因为我们不想弄乱它的文档过滤器。我真的需要这个功能。那么,有没有办法实现呢?

更新:只是我的看法,但似乎 JFormattedTextField 在这个意义上设计得非常糟糕,以至于它没有简单的解决方案来解决这个简单的问题。

马科斯

【问题讨论】:

    标签: java swing jformattedtextfield


    【解决方案1】:

    你可以简单地使用:

    JFormattedTextField field = new JFormattedTextField();
    // ...
    field.setEditable(false);
    

    就像JTextField 一样,因为JFormattedTextField 扩展了JTextField

    也请查看javadoc

    【讨论】:

    • 我希望它同时具有焦点。
    • @Marcos 一个不会阻止另一个。您仍然可以使用 CTRL+A 或 SHIFT+ARROWS 等快捷键来聚焦文本字段并修改选择。
    • 是的,我现在看到了,但这看起来很奇怪,因为当我们进入该字段时我们看不到插入符号光标。因此,有那么一刻,它给人的感觉是该字段不是焦点所有者。
    • @Marcos 当文本字段不可编辑时,它的插入符号会自动隐藏。然而,没有什么能阻止您添加 FocusListener 并使其在获得焦点时可见,并在失去焦点时使其不可见:textfield.getCaret().setVisible(true);
    【解决方案2】:

    你不能通过将 isEditable 设置为 false 来禁用编辑吗?

    textfield.setEditable(false);

    【讨论】:

    • 正如我所说,我也希望它具有焦点。
    【解决方案3】:

    如何撤消发生的每个更改:

    JFormattedTextField formattedTextField = new JFormattedTextField("Can't touch this! :)");
    formattedTextField.getDocument().addUndoableEditListener(new UndoableEditListener() {
        @Override
        public void undoableEditHappened(UndoableEditEvent e) {
            e.getEdit().undo();
        }
    });
    

    【讨论】:

    • 没有明显原因的额外工作。如果其中一个撤消失败了怎么办?而通过将 editable 设置为 false,您将无法获得异常 ..
    • 这个离开插入符号。
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 2015-11-24
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多