gpt4 book ai didi

java - 控制带有长文本的 JEditorPane 的首选大小

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:38 25 4
gpt4 key购买 nike

我有一个 JEditorPane,它显示在一个弹出窗口中,通过一个按钮触发。该 Pane 包含长文本,因此它嵌套在 JScrollPane 中,并且弹出窗口的最大尺寸被限制为 300 x 100:

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
String text = "Potentially looooooong text. " +
"Lorem ipsum dolor sit amet, consectetuer" +
"adipiscing elit, sed diam nonummy nibh euismod " +
"tincidunt ut laoreet dolore magna aliquam" +
"adipiscing elit, sed diam nonummy nibh euismod" +
"erat volutpat. Ut wisi enim ad minim veniam, " +
"quis nostrud exerci tation.";

final JEditorPane editorPane = new JEditorPane("text/html", text);
editorPane.setEditable(false);

final JButton button = new JButton("Trigger Popup");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPopupMenu popup = new JPopupMenu();
popup.setLayout(new BorderLayout());
popup.add(new JScrollPane(editorPane));
Dimension d = popup.getPreferredSize();
int w = Math.min(300, d.width);
int h = Math.min(100, d.height);
popup.setPopupSize(w, h);
Dimension s = button.getSize();
popup.show(button, s.width / 2, s.height / 2);
}
});

JFrame f = new JFrame("Layout Demo");
f.setSize(200, 200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.getContentPane().add(button);
f.setVisible(true);
}
});
}

当第一次显示 JEditorPane 实例时(即单击一次按钮时),它似乎以某种方式报告了一个太小的首选高度 (1):

first invocation

在随后的按钮点击之后,布局正是人们所期望的(2):

subsequent invocations

我如何强制/强加一个合适的首选大小,以便它总是像 (2) 一样初始化?

最佳答案

JEditorPane 无法同时计算其最终首选宽度,它必须先知道其中一个才能计算另一个。

在第一遍中,JEditorPane 根据其宽度无限的假设计算其首选高度,因此它返回单行的高度(因为文本不包含换行符。 )

在第二遍中,宽度已经设置(受第一个 JPopupMenu 的大小限制),现在它知道最大宽度,它可以计算它需要多高。

所以最简单的解决方案就是在设置文本时将宽度设置为最大值。

String text = "Potentially looooooong text. " + 
"Lorem ipsum dolor sit amet, consectetuer" +
"adipiscing elit, sed diam nonummy nibh euismod " +
"tincidunt ut laoreet dolore magna aliquam" +
"adipiscing elit, sed diam nonummy nibh euismod" +
"erat volutpat. Ut wisi enim ad minim veniam, " +
"quis nostrud exerci tation.";

final JEditorPane editorPane = new JEditorPane("text/html", text);
editorPane.setSize(300, Integer.MAX_VALUE);
editorPane.setEditable(false);

不要担心让它太大,它仍然会缩小以适应内容(如果将文本更改为 “Hello, World!”,您会看到这一点。

关于java - 控制带有长文本的 JEditorPane 的首选大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com