【发布时间】:2016-05-26 03:28:55
【问题描述】:
我没有很好的 HTML/CSS 知识,所以请原谅我缺乏知识。我正在开发一个 GUI,当发生错误时,我会在其中生成一个消息对话框。此错误消息可能很短或很长。我正在使用以下代码改编自this solution。
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class TestOptionDialog {
public static void main(String[] args) {
String msgLong = "This is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long messageThis is a freaking long message";
String msgShort = "This is a freaking short message";
int screenWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
JOptionPane.showMessageDialog(new JFrame(),
"<html><body><p style='width:100%;max-width:" + 0.6 * screenWidth + "px'>" + msgLong + "</p></body></html>",
"Error", JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(new JFrame(),
"<html><body><p style='width:100%;max-width:" + 0.6 * screenWidth + "px'>" + msgShort + "</p></body></html>",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
我的问题是,如果我只将宽度变量设置为某个像素数(例如 0.6*screenWidth),则会成功包装太长的消息,但是对于短消息,对话框比文本大得多。 相反,如果我只设置 max-width 参数,短消息会以完美的尺寸显示,但是太长的消息不会按照我的意愿包装到屏幕尺寸的 60%。
所以我想,我将只使用这两个参数并将宽度设置为 100%(正如我在某处读到的那样),但这仍然不会包含太长的消息。我怎样才能做到这两点?
编辑:在使用效果很好的 Marius 答案后,我遇到了以下问题:即使计算出的文本宽度高于阈值(例如,60% screenWidth),对话框不会中断。有人明白发生了什么还是我错过了什么?看下面的代码 sn-p 和输出:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class TestOptionDialog {
public static void main(String[] args) {
// 1512 px
String message = "message message message message message message message message message message message message message message message message message message message message message message message message message message message ";
// 1232 px
String message1 = "message message message message message message message message message message message message message message message message message message message message message message ";
// 1064 px
String message2 = "message message message message message message message message message message message message message message message message message message message ";
// Break line at:
int threshold = 1152;
JOptionPane.showMessageDialog(new JFrame(),getFormattedErrorMessage(message, threshold),
"Error", JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(new JFrame(),getFormattedErrorMessage(message1, threshold),
"Error", JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(new JFrame(),getFormattedErrorMessage(message2, threshold),
"Error", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
private static String getFormattedErrorMessage(String message, int maxDialogWidth) {
String string;
JLabel label = new JLabel(message);
if (label.getPreferredSize().width > maxDialogWidth) {
string = "<html><body><p style='width:" + maxDialogWidth + "px;'>" + message + "</p></body></html>";
} else {
string = "<html><body><p>" + message + "</p></body></html>";
}
return string;
}
}
【问题讨论】:
-
Swing 对 HTML/CSS 的理解是原始的。它支持 HTML 3.2 的 子集 和少量 CSS。我怀疑
max-width是否曾经得到 Swing HTML 渲染引擎的支持。 -
好的,很高兴了解 Swing 和 HTML/CSS 的关系。我在上面构建了我的示例,以使其尽可能小且独立。缺少什么?
-
“缺少什么?” 我对此不好。什么都没有,这是 MCVE 的一个很好的例子。在发表我的(愚蠢的)评论之前我只看了一眼(我很快删除了那部分 - 希望我在你看到它之前就这样做了 - 哎呀!)。
标签: java html css swing joptionpane