在JScrollPane中的JEditorPane中包装HTML文本

在一个应用程序中,我使用不可编辑的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 item #" + i + "." + " 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,请指出它们:)

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

有关该类的信息,请参阅Scrollable Panel以及有关该类如何工作的说明。

如果视口的大小小于其视图组件的首选大小,则会显示JScrollPane的滚动条。 在滚动窗格中设置面板的首选大小,或设置每个编辑器窗格的首选大小:面板的首选大小将是编辑器窗格的首选大小的组合(首选高度的总和,以及最大宽度的最大值)