在JScrollPane中包装JEditorPane中的HTML文本

3
在一个应用中,我使用不可编辑的JEditorPanes作为一种通用的UI小部件来显示较为复杂的内容(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);
  }

}

并且产生以下结果:

然而,我可能有很多这些,并且需要使用垂直滚动条。

所以我把整个东西放在了JScrollPane中(在示例代码中将useScrollPane变量更改为true以查看此版本)。

如果我缩小窗口高度,这会给我一个垂直滚动条,但问题是现在文本不再换行:

那么问题是:如何同时获得文本换行和垂直滚动条?

正如您所见,我禁用了水平滚动条,但这并没有太大帮助。

PS. 我对Swing没有太多经验,因此如果您在此代码中看到一些初学者的WTF,请指出它们 :)

2个回答

4
// JPanel panel = new JPanel();
ScrollablePanel panel = new ScrollablePanel();
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );

请查看Scrollable Panel,了解该类的使用方法和说明。

太好了!我最终为了自己的需求创建了一个更简单、不那么灵活的JPanel + Scrollable实现,现在它运行得非常好。 - mjomble

0

如果视口的大小小于其视图组件的首选大小,则JScrollPane的滚动条将出现。设置滚动窗格中面板的首选大小,或设置每个编辑器面板的首选大小:面板的首选大小将是编辑器面板的首选大小的组成(首选高度之和和首选宽度的最大值)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接