有没有办法在 JOptionPane.showMessageDialog() 上打印多行图案?
Is there a way to print a multiline pattern on JOptionPane.showMessageDialog()?
所以我想知道是否有一种方法可以在 JOptionPane.showMessageDialog() 上输出带有星号 (*) 的多线图案,例如三角形或金字塔。我知道它是这样工作的:JOptionPane.showMessageDialog(null,"Hello World!");但不是 Hello World!我需要在弹出空心金字塔的新 window 上打印,但我无法弄清楚。你能帮助我吗?提前致谢。我添加了打印空心金字塔的代码。变量 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();
}
与其一次将文本打印几个字符到 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(...)
的默认字体默认情况下不是 mono-spaced,这意味着字符的长度宽度可变。尝试有效地显示 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);
这产生:
所以我想知道是否有一种方法可以在 JOptionPane.showMessageDialog() 上输出带有星号 (*) 的多线图案,例如三角形或金字塔。我知道它是这样工作的:JOptionPane.showMessageDialog(null,"Hello World!");但不是 Hello World!我需要在弹出空心金字塔的新 window 上打印,但我无法弄清楚。你能帮助我吗?提前致谢。我添加了打印空心金字塔的代码。变量 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();
}
与其一次将文本打印几个字符到 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(...)
的默认字体默认情况下不是 mono-spaced,这意味着字符的长度宽度可变。尝试有效地显示 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);
这产生: