JTextArea показывает каретку, в то время как setEditable имеет значение false - PullRequest
8 голосов
/ 30 августа 2011

Как я могу поместить Caret в JTextArea, когда setEditable отключен?

Пример кода, когда мне нужно, чтобы Карет была видна:

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).

Ответы [ 3 ]

12 голосов
/ 30 августа 2011

text.getCaret().setVisible(true) и / или text.getCaret().setSelectionVisible(true)

2 голосов
/ 30 августа 2011

Хорошо, я поместил здесь фрагмент кода, который показывает каретку, но не позволяет редактировать 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);
}

Обратите внимание, что пользователь может перемещать курсор, но он не может редактировать текст

1 голос
/ 13 мая 2019

Я попробовал решение, изначально предложенное Станиславом Л. Однако возникли и другие проблемы. Например, после выхода из 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);
    }
});

В приведенном выше примере я решил оставить выделение видимым, даже если он покидает текстовую область.

...