Выравнивание текста не работает в 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 и установив их выравнивания соответственно

и, скорее всего, есть больше способов сделать это.

Другие вопросы по тегам