【问题标题】:Is there a way to print a multiline pattern on JOptionPane.showMessageDialog()?有没有办法在 JOptionPane.showMessageDialog() 上打印多行模式?
【发布时间】:2020-10-05 08:11:50
【问题描述】:

所以我想知道是否有一种方法可以在 JOptionPane.showMessageDialog() 上输出带有星号 (*) 的多线模式,例如三角形或金字塔。我知道这是这样工作的: JOptionPane.showMessageDialog(null,"Hello World!");但不是 Hello World!我需要在弹出一个空心金字塔的新窗口上打印,我无法弄清楚。你能帮助我吗?提前致谢。我添加了打印空心金字塔的代码。变量 L 是金字塔的高度,它由用户在程序执行时提供。那么如何在 JOptionPane.showMessageDialog() 中以可变高度打印此模式?

for(int row=1;row<=L;row++){
    for(int col=1;col<=L+L-1;col++){
        if(row==L || row+col==L+1 || col-row==L-1) System.out.print("*");
        else System.out.print(" ");
    }
    System.out.println();
}

【问题讨论】:

    标签: java joptionpane multiline


    【解决方案1】:

    您应该将这些字符附加到一个字符串变量(或者最好是 StringBuilder 以获得更好的性能),而不是一次将几个字符打印到 System.out

    // create an empty string and generate the pyramid by adding characters
    String pyramid = "";
    for (int row = 1; row <= L; row++) {
        for (int col = 1; col <= L + L - 1; col++) {
            if (row == L || row + col == L + 1 || col - row == L - 1) pyramid += "*";
            else pyramid += " ";
        }
        pyramid += "\n";
    }
    // outputs the same thing as all the tiny System.out writes in the original question
    System.out.println(pyramid);
    

    对于较小的学术问题,并不完全需要优化;但是,为了将来参考,您应该在连接大量小字符串时使用StringBuilder。我提到这一点的原因是,在内部,当您将两个字符串“添加”(即连接)在一起时,您实际上每次都分配了另一个新字符串。当在循环中使用时,这可能会增加很多新的字符串分配。


    请注意,JOptionPane.showMessageDialog(...) 的默认字体默认不是等距的,这意味着字符具有可变长度宽度。尝试有效地显示 ASCII 艺术可能效果不佳。这可以通过使用不可编辑的透明文本区域来规避:

    JTextArea textbox = new JTextArea(pyramid);
    textbox.setOpaque(false);
    textbox.setEditable(false);
    textbox.setFont(new Font("Monospaced", Font.BOLD, 12));
    JOptionPane.showMessageDialog(null, textbox, "Pyramid", JOptionPane.PLAIN_MESSAGE);
    

    这会产生:

    【讨论】:

    • 我知道我可以使用换行符,问题是金字塔的高度存储在一个变量中,每次执行程序时用户确定高度。所以这不是我的问题的解决方案。我将在主要问题上添加一些内容以帮助您更好地理解,因此请注意它。感谢您的宝贵时间
    • @AntonisChliaras 这应该已经清楚地表达了 - 在最初的帖子中没有提到这个额外的限制。
    • 是的,我不澄清这一点很糟糕。我很抱歉。
    • @AntonisChliaras 我已经更新了我的答案。这对您有意义并满足您的限制条件吗?
    • 非常感谢,这对我帮助很大。这对我来说很有意义,而且效果很好。
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2021-07-14
    • 2015-03-17
    • 1970-01-01
    • 2022-01-05
    • 2020-09-24
    • 2021-10-28
    相关资源
    最近更新 更多