微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在JOptionPane.showMessageDialog上打印多行模式?

如何解决有没有办法在JOptionPane.showMessageDialog上打印多行模式?

所以我想知道是否有一种方法可以在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();
}

解决方法

您应该将字符附加到String变量(或者最好是System.out,以提高性能),而不是一次在StringBuilder上打印几个字符。

// 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);

这将产生:
L=15 pyramid

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。