Выравнивание текста не работает в java swing jTextPane
Я хочу выровнять два раздела текстов на одной строке: первый раздел должен быть выровнен по левой стороне, а другой раздел должен быть выровнен по правой стороне java-свинга JTextPane. Я пытался использовать интерфейс стиля и класс Styleconstants для выравнивания текста, но это не сработало. Но когда я применил некоторые другие стили, такие как Styleconstants.setFontSize (), Styleconstants.setForeGroundColor (), к тому же тексту, он работает нормально.
Вот мой код:
JTextPane pane = new JTextPane();
StyledDocument sdoc = pane.getStyledDocument();
SimpleAttributeSet rightAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT);
StyleConstants.setForeground(rightAlign, Color.lightGray);
StyleConstants.setFontSize(rightAlign, 11);
sdoc.insertString(sdoc.getLength(), "name", null);
sdoc.insertString(sdoc.getLength(), "timeHis" + "\n", rightAlign);
Это дает вывод как
nametimeHis
но я хочу вывод, как это
время его
(точно противоположная сторона в JTextpane в той же строке)
Что-то не так в моем коде? Как я могу решить эту проблему?
1 ответ
Я не думаю, что вы можете установить два разных выравнивания для одной и той же линии (AFAIK вы не можете сделать это даже в профессиональных текстовых редакторах - просто установив выравнивание). Я переписал ваш код так:
SimpleAttributeSet rightAlign = new SimpleAttributeSet();
SimpleAttributeSet leftAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT);
StyleConstants.setForeground(rightAlign, Color.lightGray);
StyleConstants.setFontSize(rightAlign, 11);
StyleConstants.setAlignment(leftAlign, StyleConstants.ALIGN_LEFT);
StyleConstants.setForeground(leftAlign, Color.black);
StyleConstants.setFontSize(leftAlign, 13);
String left = "name";
String right = "timeHis\n";
sdoc.insertString(0, left, leftAlign);
sdoc.insertString(left.length(), right, rightAlign);
sdoc.setParagraphAttributes(0, left.length(), leftAlign, false);
sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(), rightAlign, false);
Размер и цвет в порядке, но выравнивание обеих строк правильное. Если вы меняете выравнивания в последних двух строках, как это:
sdoc.setParagraphAttributes(0, left.length(), rightAlign, false);
sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(),leftAlign, false);
оба будут выровнены по левому краю, но если вы добавите новую строку в левой строке:
String left = "name\n";
выравнивание также становится почетным. Метод setParagraphAttributes делает именно то, что он говорит - дело в том, что выравнивание является атрибутом абзаца - откройте OO Writer или MS Word(pad), напишите некоторый текст и выровняйте его - это будет понятнее.
Когда я хочу добиться такого выравнивания в MS Word/OO Writer, я создаю таблицу с невидимыми границами и задаю левому столбцу левое выравнивание, а правому столбцу - правое выравнивание. Это привело бы к заключению, что нам нужен класс HTMLDocument (потому что вы можете создать таблицу в HTML), который реализует интерфейс StyledDocument. Итак, я попробовал это:
JTextPane pane = new JTextPane(new HTMLDocument());
что приводит к отсутствию стиля. Это имеет смысл, поскольку каскадные таблицы стилей - это правильный способ стилизации HTML. Этот конструктор также объясняет это:
public HTMLDocument(StyleSheet styles)
Вот ссылка на аргумент конструктора Style Sheet.
Но это сделает свое дело:
JTextPane pane = new JTextPane();
pane.setEditorKit(new HTMLEditorKit());
Устанавливает набор вещей, необходимых текстовому компоненту, чтобы быть разумно работающим редактором для некоторого типа текстового содержимого. EditorKit действует как фабрика для какой-то политики. Например, может быть предоставлена реализация html и rtf, которая может быть заменена другими реализациями.
Вот несколько методов EditorKit:
createCaret()
getContentType()
read(Reader in, Document doc, int pos)
write(Writer out, Document doc, int pos, int len)
Итак, в основном это программируемый редактор (с помощью методов чтения и записи) для текстового содержимого текстового компонента, а именно Document:
Документ - это контейнер для текста, который служит моделью для компонентов текстового свинга. Цель этого интерфейса - масштабирование от очень простых потребностей (текстовое поле в виде простого текста) до сложных потребностей (например, HTML или XML-документ).
Следовательно, HTMLEditorKit - это программируемый редактор для текстового содержимого HTML текстового компонента, а именно HTMLDocument - внимательно изучите цепочку наследования этого класса и реализующие интерфейсы - вы увидите почти все из них в этом ответе.
Теперь, это волшебная часть из apidoc HTMLEditorKit:
Хотя Документ по умолчанию обеспечивает поддержку HTML, ничто не мешает поддерживать теги, отличные от HTML, которые приводят к альтернативным структурам элементов.
Таким образом, похоже, что реализация по умолчанию этого класса перевела наши атрибуты стиля в HTML/CSS именно так, как мы хотели: выравнивание по левому и правому краю в одной строке.
Это имеет смысл, потому что с HTML/CSS вы можете сделать это как минимум двумя способами:
- сделать таблицу из двух столбцов и установить их выравнивания соответственно
- сделав два плавающих элемента div и установив их выравнивания соответственно
и, скорее всего, есть больше способов сделать это.