JTextPane Синхронизировать стиль выбора проблемы пользовательского интерфейса - PullRequest
5 голосов
/ 30 января 2010

Я занимаюсь разработкой простого редактора WYSIWYG RTF на Java, и у меня возникла небольшая проблема. Мне нужно иметь возможность синхронизировать переключатели выбора стиля (например, полужирный, курсив, подчеркнутый) с выбором текста пользователя. Например, если текущим выделенным текстом является простой текст, кнопки переключения жирным шрифтом, курсивом и подчеркиванием не выбираются, но когда пользователь выбирает какой-либо текст, выделенный жирным шрифтом и подчеркиванием, выбираются кнопки переключения жирным шрифтом и подчеркнутые.

Теперь я совершенно уверен, что JTextPane.getInputAttributes() дает мне нужные атрибуты выбора, но есть проблема с прослушиванием событий обновления каретки. Проблема заключается в том, что слушатель каретки, подключенный к JTextPane, кажется, вызывается ПОСЛЕ того, как произойдет изменение входного атрибута. Так что выбор всегда на шаг позади. То есть я должен дважды выделить текст, прежде чем переключать кнопки!

Важный код здесь:

textPane.addCaretListener(new CaretListener() {

        @Override
        public void caretUpdate(CaretEvent e) {
            syncAttributesWithUI(textPane.getInputAttributes());
        }
    });

И

private void syncAttributesWithUI(AttributeSet attributes) {
    boldButton.setSelected(StyleConstants.isBold(attributes));
    italicButton.setSelected(StyleConstants.isItalic(attributes));
    underlineButton.setSelected(StyleConstants.isUnderline(attributes));
}

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2010

CaretListener прослушивает ваш textPane, но существующие атрибуты для выбора находятся в вашем Document. Вы можете использовать методы CaretEvent, чтобы найти выбранную часть Document и настроить ваши кнопки на основе найденных там стилей. К сожалению, выбор может быть несогласованным, например, частично жирным шрифтом и частично курсивом. Обычная практика - предполагать, что пользователь хочет применить совершенно новый набор атрибутов ко всему выбору.

0 голосов
/ 09 февраля 2010

Вы можете попытаться отложить синхронизацию, чтобы сначала произошли другие изменения:

@Override
public void caretUpdate(CaretEvent e) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            syncAttributesWithUI(textPane.getInputAttributes());
        }
    });
}

(Отказ от ответственности: догадываясь по макушке головы - на самом деле я не написал тест для подтверждения)

...