使用width和max-width来包装JOptionPane

时间:2016-02-15 09:30:50

标签: java html css swing joptionpane

我没有良好的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;
    }
}

1064 px: 1064 px 1232 px: 1232 px 1512 px: 1512 px

1 个答案:

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

}

enter image description here enter image description here

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

事实上,如果你想给出一个比主屏幕大60%的弹出窗口,是的,这种方法是正确的。