JTextArea显示Caret,而setEditable为false

时间:2011-08-30 12:45:23

标签: java swing jtextarea

如果禁用setEditable,我怎样才能将Caret放入JTextArea?

当我需要Caret可见时的示例代码:

public void run(){
    JFrame frame = new JFrame();
    JTextArea text = new JTextArea();
    text.setEditable(false);
    String line = "added line";
    text.append(line);
    text.setCaretPosition(text.getCaretPosition() + line.length());

    frame.getContentPane().add(text);
    frame.setSize(300,300);
    frame.setVisible(true);
}

我想要实现的是,当用户在TextArea中键入时,不得显示字符。键入的字符被重定向到OutputStream,并且接收到适当的InputStream,它将显示在TextArea中。这样可以正常工作,但由于setEditable(false),Caret被隐藏了。

3 个答案:

答案 0 :(得分:12)

text.getCaret().setVisible(true)和/或text.getCaret().setSelectionVisible(true)

答案 1 :(得分:2)

好吧,我在这里放了一个显示插入符号的代码片段,但是不要编辑JTextArea。我希望它对你有所帮助。这是一个与文本区域焦点相关的小技巧,当获得焦点时,版本被禁用;但是当它被丢失时,这个版本是可能的。这样,用户无法编辑它,但可以看到插入符号。

public void run() {
    JFrame frame = new JFrame();
    final JTextArea text = new JTextArea();
    text.addFocusListener(new FocusListener() {

        public void focusLost(FocusEvent fe) {
            text.setEditable(true);     
        }

        public void focusGained(FocusEvent fe) {
            text.setEditable(false);
        }
    });
    text.setEditable(true);
    String line = "added line";
    text.append(line);
    text.setCaretPosition(text.getCaretPosition() + line.length());

    frame.getContentPane().add(text);
    frame.setSize(300,300);
    frame.setVisible(true);
}

请注意,用户可以移动插入符,但他/她无法编辑文本

答案 2 :(得分:1)

我尝试了StanislavL最初提出的解决方案。但是,出现了其他问题。例如,离开JTextArea并稍后再聚焦之后,插入符号将再次变为不可见。

我怀疑插入符号没有像大多数人期望的那样实施。当我看到一些作者提议重新实现插入符号时,我通过以下小型侦听器成功实现了可见的插入符号行为:

textArea.getCaret().setVisible(true);
textArea.getCaret().setSelectionVisible(true);
textArea.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {
        textArea.getCaret().setVisible(true);
        textArea.getCaret().setSelectionVisible(true);
    }

    @Override
    public void focusLost(FocusEvent e) {
        textArea.getCaret().setSelectionVisible(true);
    }
});

在上面的示例中,即使有人离开了文本区域,我还是决定保持选择可见。