Каретка в текстовых компонентах видна, несмотря на setEditable(false)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Каретка в текстовых компонентах видна, несмотря на setEditable(false)

Сообщение Anonymous »

Я запускаю приложение Java Swing, которое для отображения информации в значительной степени использует текстовые компоненты. Я использую JextField, JTextArea и JTextPane, а также:
textComponent.setEditable(false);
textComponent.setFocusable(false);

для достижения режима «только отображение». Это работало нормально, пока я не перешел с Java 17 на Java 25.0.2. С тех пор внутри нередактируемых текстовых компонентов отображается подвижная каретка. Текст по-прежнему недоступен для редактирования, но курсор заставляет меня так думать.
Я мог бы добавить textComponent.getCaret().setVisible(false), но мне пришлось бы изменить это в множестве мест. Прежде чем это сделать, я хотел получить подтверждение, что это (по какой-то непонятной мне причине) намеренное изменение поведения, а не ошибка. Мне не удалось найти официального заявления.
Изменить:
Небольшая поправка к моему первоначальному утверждению: курсор на самом деле не виден, если компонент не фокусируется. Мне нужно, чтобы он мог фокусироваться, чтобы он мог перехватывать ключевые события.
  • Версия Java: JDK 25.0.2
  • Версия ОС: Windows 11 (25H2)
  • Внешний вид: javax.swing.plaf.metal.MetalLookAndFeel (по умолчанию)
Код для воспроизвести:
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class CaretTest {

public static void main (String[] args) {

final JFrame frame = new JFrame();
frame.setTitle("Caret Test");

final JTextField textField = new JTextField();
textField.setText("why is there a caret?");
textField.setEditable(false);

final JPanel content = new JPanel(new GridLayout(1,1));
content.setBorder(new EmptyBorder(5,5,5,5));
content.setPreferredSize(new Dimension(300,40));
content.add(textField);

frame.setContentPane(content);
frame.pack();

SwingUtilities.invokeLater(() -> frame.setVisible(true));
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... tablefalse
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»