java - JTextPane 中的插入符位置不正确?!错误或预期的行为?

标签 java swing jtextarea jtextpane caret

我遇到了以下问题:

我想读取 JTextComponent 文档中组件插入符号位置的字符。当我使用 JTextPane 时,插入符号位置返回的字符不正确。更详细地说,返回的字符是字符是插入符号的位置减去行数! (插入符号位置 - 当前行的编号)。另一方面,当我使用 JTextArea 时,结果是正确的...为了证明这一点,我已经实现了一个示例程序,您可以使用它。

所以最大的问题是,在 JTextPane 的情况下,我如何获得插入符位置的字符?

为什么 JTextPane 不返回与 JTextArea 相同的插入符号位置,而且为什么 JTextPane 返回的字符不是我们在屏幕上看到的字符? 所描述的行为是错误吗?

您可以在下面找到示例程序的代码以及非常有趣和意想不到的结果的屏幕截图

使用 JTextPane。 CARET 位置 17 中的字母是 e。不……

alt text

使用一个 JTextArea。在这里,我的插入符与以前的位置相同,但现在我得到插入符位置 20,返回字母是\r\n(with 是预期的)。

alt text

这是您可以用来查看这种奇怪行为的代码:

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

public class Example extends JFrame {
//  use this instead of JTextPane to see the difference

//  JTextComponent testingArea = new JTextArea(5,10);  
    JTextComponent testingArea = new JTextPane();
JButton button = new JButton("test");
JTextComponent resultArea = new JTextField(20);


public Example() {
    initialise();
    testingArea.setText("line1\r\nline2\r\nline3\r\nline4");
}


private void initialise() {
    testingArea.setPreferredSize(new Dimension(100,100));
    setLayout(new FlowLayout());
    getContentPane().add(testingArea);
    getContentPane().add(new JLabel("answer"));
    getContentPane().add(resultArea);
    getContentPane().add(button);
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            try { 
                int caretPosition = testingArea.getCaretPosition();
                char result = testingArea.getText().charAt(caretPosition);
                resultArea.setText("Char at caretPosition " + caretPosition + " is " + result);
            }catch (Exception e2) {
                e2.printStackTrace();
                resultArea.setText("ERROR");
            }

        }
    });
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    final Example ex = new Example();
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            ex.pack();
            ex.setVisible(true);

        }
    });
}
}

感谢您的帮助!

PS 我使用的是 Java 6。

最佳答案

使用

char result = testingArea.getDocument().getText(caretPosition,1).charAt(0);

而不是

char result = testingArea.getText().charAt(caretPosition);

关于java - JTextPane 中的插入符位置不正确?!错误或预期的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878392/

相关文章:

java - 将 JFrame 信息发送到打印机

java - 未设置 jscrollpane 中 jtextarea 的位置和大小

java - 在 Java 中使用 BlowFish 进行加密

java - Spring Data REST repository 时不时404

Java JApplet 图形双缓冲

java - 如何在 JTextArea 中添加可点击的 URL?

java - 如何将 GUI 组件放入 OpenGL 屏幕中

java - 将数据从jsp传输到servlet

java - 在windows中集成Apache Storm与zookeeper

java - JPanel 没有出现在 JDialog 中