我没有良好的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);
}
}
我的问题是,如果我只将width变量设置为某个像素数(例如0.6 * screenWidth),则会成功包装太长的消息,但是对于短消息,对话框比文本大得多。 相反,如果我只设置了max-width参数,那么短消息会以完美的大小显示,但是太长的消息不会像我想的那样被包装到60%的屏幕大小。
所以我想,我只是使用两个参数并将宽度设置为100%(正如我在某处读到的那样),但是它仍然没有包含太长的消息。我怎样才能实现这两个目标?
编辑:使用Marius的答案后,运行良好,我遇到了以下问题:即使计算出的文字宽度高于阈值(例如,60) %screen of screenWidth),对话框不会中断。有人知道发生了什么或者我错过了什么吗?请参阅以下代码段和输出:
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;
}
}
答案 0 :(得分:2)
这有点棘手。一个'脏'的解决方案是只在你需要的时候才添加“width”css属性;见附件代码:
public class TestOptionDialog {
public static void main(String[] args) {
String msgLong = "This is a freaking long messageThis is a freaking long messags a freaking long messageThis is a freakis a freaking long messageThis is a freakieThis is a freaking ls a freaking long messageThis is a freakiong 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;
int maxDialogWidth = (int) (0.6 * screenWidth);
JOptionPane
.showMessageDialog(new JFrame(),
getMessage(msgLong, maxDialogWidth), "Error",
JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(new JFrame(),
getMessage(msgShort, maxDialogWidth), "Error",
JOptionPane.ERROR_MESSAGE);
}
private static String getMessage(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;
}
}
修改强>
请注意java.awt.Toolkit.getDefaultToolkit().getScreenSize().width
将占用“主”屏幕的屏幕宽度;因此,如果您有一个全屏应用程序,并且如果用户在“辅助”屏幕上运行该应用程序,则该值可能不是您要查找的值;此外,如果用户未在全屏模式下运行您的应用程序,则该值可能不是您要查找的值。
事实上,如果你想给出一个比主屏幕大60%的弹出窗口,是的,这种方法是正确的。