Обтекание HTML-текста в JEditorPane внутри JScrollPane - PullRequest
3 голосов
/ 03 марта 2011

В приложении я использую не редактируемые JEditorPanes в качестве своего рода универсального виджета пользовательского интерфейса, который может отображать довольно сложный контент (HTML поможет), обтекать текстовые строки и ловить щелчки мыши. Не уверен, что JEditorPane - хороший выбор для этого, поэтому не стесняйтесь предлагать альтернативы.

Следующий пример кода работает довольно хорошо:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class Main {

  private static JPanel createPanel() {
    JPanel panel = new JPanel();
    panel.setLayout(new GridBagLayout());

    for (int i = 0; i < 3; i++) {
      JEditorPane editorPane = new JEditorPane();
      editorPane.setEditable(false);
      editorPane.setContentType("text/html");

      String text =
        "This is <b>item #" + i + "</b>." +
        " It's got text on it that should be wrapped."
      ;

      editorPane.setText(text);

      GridBagConstraints constraints = new GridBagConstraints();
      constraints.gridx = 0;
      constraints.gridy = i;
      constraints.fill = GridBagConstraints.HORIZONTAL;
      constraints.weightx = 1.0;
      constraints.insets.bottom = 5;

      panel.add(editorPane, constraints);
    }

    return panel;
  }


  public static void main(String[] args) {
    JPanel panel = createPanel();

    JFrame frame = new JFrame();
    frame.setSize(200, 200);
    frame.setLocation(200, 200);

    // Change this to switch between examples
    boolean useScrollPane = false;

    if (useScrollPane) {
      JScrollPane scrollPane = new JScrollPane();
      scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
      scrollPane.setViewportView(panel);
      frame.add(scrollPane);
    }
    else {
      frame.add(panel);
    }

    frame.setVisible(true);
  }

}

и производит следующее:

image

Однако у меня их может быть много, и я могу использовать вертикальную полосу прокрутки.

Поэтому я поместил все это в JScrollPane (измените переменную useScrollPane на true в примере кода, чтобы увидеть эту версию).

Это дает мне вертикальную полосу прокрутки, если я уменьшаю высоту окна, но проблема в том, что теперь текст больше не переносится:

image

Итак, вопрос в том, как мне получить как перенос текста, так и вертикальную полосу прокрутки?

Как видите, я отключил горизонтальную полосу прокрутки, но это мало помогло.

PS. У меня нет большого опыта работы с Swing, поэтому, если вы видите в этом коде несколько WTF для начинающих, укажите их:)

Ответы [ 2 ]

4 голосов
/ 03 марта 2011
// JPanel panel = new JPanel();
ScrollablePanel panel = new ScrollablePanel();
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );

См. Прокручиваемая панель для класса и объяснение того, как работает класс.

0 голосов
/ 03 марта 2011

Полосы прокрутки JScrollPane появляются, если размер области просмотра становится меньше, чем предпочтительный размер его компонента представления.Установите предпочтительный размер панели на панели прокрутки или задайте предпочтительный размер каждой из панелей редактора: предпочтительным размером панели будет состав предпочтительных размеров панелей редактора (сумма предпочтительной высоты имакс предпочтительной ширины)

...