gpt4 book ai didi

java - 使用 width 和 max-width 在 JOptionPane 中换行文本

转载 作者:行者123 更新时间:2023-11-30 03:03:19 25 4
gpt4 key购买 nike

我没有很好的 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),对话框不会中断。有人明白发生了什么事还是我错过了什么?请参阅以下代码片段和输出:

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;
}
}

1064 像素: 1064 px1232 像素: 1232 px1512 像素: 1512 px

最佳答案

这有点棘手。一个“肮脏”的解决方案是仅在需要时才添加“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;
}

}

enter image description here enter image description here

编辑请记住,java.awt.Toolkit.getDefaultToolkit().getScreenSize().width将采用“主”屏幕的屏幕宽度;因此,如果您有一个全屏应用程序,并且用户在“辅助”屏幕上运行该应用程序,则该值可能不是您要查找的值;另外,如果用户没有在全屏模式下运行您的应用程序,则该值可能不是您要查找的值。

如果事实上,您只想提供一个主屏幕大小 60% 的弹出窗口,是的,这种方法是正确的。

关于java - 使用 width 和 max-width 在 JOptionPane 中换行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35405672/

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