在一个应用程序中,我使用不可编辑的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,请指出:)
答案 0 :(得分:4)
// JPanel panel = new JPanel();
ScrollablePanel panel = new ScrollablePanel();
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
请参阅Scrollable Panel了解该课程以及该课程如何运作的解释。
答案 1 :(得分:0)
如果视口的大小小于其视图组件的首选大小,则会出现JScrollPane的滚动条。在滚动窗格中设置面板的首选大小,或设置每个编辑器窗格的首选大小:面板的首选大小将是编辑器窗格的首选大小的组合(首选高度的总和,以及最大宽度的最大值)