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!"
.