2010-01-30 2 views
5

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

Теперь я уверен, что 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)); 
} 

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

+0

На ваш вопрос ответили? Если нет, рассмотрите сообщение SSCCE –

ответ

1

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

+0

. Метод, который вы предлагаете, на самом деле является тем, что я изначально делал. Я бы получил каждый отдельный элемент символа выделения и нашел пересечение набора атрибутов, чтобы определить, что должен отражать пользовательский интерфейс. Но потом я понял, что 1) метод getInputAttributes(), похоже, делает это уже, и 2) Мой метод не может определить, какой стиль применяется, если каретка перемещена в последнюю позицию в документе до тех пор, пока пользователь не активирует ввод. Конечно, я могу, вероятно, определить это, разработав стиль персонажа в (конечная позиция - 1), но я надеялся, что там будет более чистый способ :( – S73417H

+0

Я бы ожидал, что пользователь захочет атрибуты, возвращаемые 'getInputAttributes() 'оставаться неизменным, когда карет находится в конце. – trashgod

0

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

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

(Отказ от ответственности: Гадание с верхней части моей головы, - я фактически не написать тест, чтобы подтвердить)