【问题标题】:Java Swing - How to position cursor inside JTextField from PlainDocumentJava Swing - 如何从 PlainDocument 将光标定位在 JTextField 内
【发布时间】:2017-01-09 18:20:50
【问题描述】:

我的 java swing 应用程序有一个 JTextFied。我使用 PlainDocument 子类进行输入操作。

public class MaskDecimalDocument extends PlainDocument {

   public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

      //manipulation input code

      super.insertString(0, manipulatedText, a);

   }

}

用户插入一个字符,insertString 方法处理该字符并将其插入到文本中。下一个操作,光标位于文本的末尾。如何将光标定位在原始位置?

【问题讨论】:

    标签: java swing jtextfield


    【解决方案1】:

    您可能需要考虑使用DocumentFilter,因为它是用于处理Document 更改的更新API。概念是相同的,但类更可重用,因为它可以添加到任何Document

    阅读 Implementing a DocumentFilter 上的 Swing 教程部分了解更多信息。

    如何将光标定位在原来的位置?

    当您创建自定义DocumentFilter 类时,您需要传入使用Document 作为参数的文本字段,并将此文本字段保存为您的类的实例变量。

    那么replaceSelection(...) 方法中的逻辑将类似于:

    int caretPosition = textField.getCaretPosition();
    super.replaceSelection(...);
    textField.setCaretPosition( caretPosition );
    

    请注意,您可能需要将 setCaretPosition(...) 方法放在 SwingUtilities.invokeLater() 中,以确保在设置插入符号位置的默认处理之后执行代码。

    【讨论】:

      【解决方案2】:

      控制插入符号的位置不是 Document 的工作。您应该 set a NavigationFilter 忽略对插入符号位置的所有更改:

      textField.setNavigationFilter(new NavigationFilter() {
          @Override
          public void setDot(FilterBypass bypass,
                             int position,
                             Position.Bias bias) {
              // Deliberately empty
          }
      
          @Override
          public void moveDot(FilterBypass bypass,
                              int position,
                              Position.Bias bias) {
              // Deliberately empty
          }
      
          @Override
          public int getNextVisualPositionFrom(JTextComponent component,
                                               int position,
                                               Position.Bias bias,
                                               int direction,
                                               Position.Bias[] newBias) {
              return position;
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 2020-07-11
        • 2013-04-29
        • 2011-08-10
        • 2012-01-08
        • 1970-01-01
        相关资源
        最近更新 更多