2014-09-13 65 views
1

我想首先感谢stackoverflow社区和所有回答这些问题的优秀人士。更常见的是,我通过阅读而不是打字来找到自己的答案,但是我时间紧迫,因为这是一项必须在接下来的几天内完成的家庭作业。所以这是我的问题。打印StringBuffer JOptionPane

编程介绍> ASCII艺术项目>我想将它打印到一个窗口,而不仅仅是无聊的控制台。

这是我想出了这么远,但(当相同的StringBuilder打印到控制台它看起来是意指)的图像不看在JOptionPane.showMessageDialog正确:

import javax.swing.*; 

public class R2D2 
{ 
    public static void main(String[] args) 
    {  
    boolean test = false;//Create and initialize boolean variable; later used to break out of the Do While loop. 

    do 
    { 
    String name = JOptionPane.showInputDialog("Who is everyone's favorite Droid?");//GUI asking for 'favorite droid' input. 

    if (name.equalsIgnoreCase("R2D2") || name.equalsIgnoreCase("R2"))//Sets boolean test to true if the user inputs the correct answer ie 'R2D2' or 'R2', not case sensitive. 
    { 
     test = true; 
    } 

    else 
    { 
     JOptionPane.showMessageDialog(null, "Nope! Try Again...Dummy.");//Chides the user. 
    } 
    } 
    while (test == false);//Continues back to the top if the user doesn't answer correctly. 


    String l0 = new String("    _____________     ");//In lines 14,15,16 the escape used to place the backslash has no real 
    String l1 = new String("    /_/_/_/_/_/_/_\\    ");//effect because there isn't any ASCII art to the right of the escape (oh no, I just 
    String l2 = new String("    /_/_/_/_/_/_/_/_\\    ");//realized you probably won't like how I am spanning lines with the single line commentor). 
    String l3 = new String("   / _______ \\    "); 
    String l4 = new String("   / /(\"\") \\ \\   ");//The first double quote is shifted one character to the right, the second double quote is shifted two characters to the right, the second backslash (of the first backslash grouping) is shifted three characters to the right, and the second backslash (of the second backslash grouping) is shifted four characters to the right. It's kinda lonely out here. 
    String l5 = new String("   / /_________\\ \\   ");//1 escape in R2's body results in his right edge being shifted to the right one character. 
    String l6 = new String("  /      \\   "); 
    String l7 = new String("  /   0 (O) \\   ");//Again no real effect seen from the escapes on lines 19, 20, 21. 
    String l8 = new String("  /       \\   "); 
    String l9 = new String(" ____(  ---------------  )____  "); 
    String l10 = new String(" | |  ---------------  | | "); 
    String l11 = new String(" | |        | | "); 
    String l12 = new String(" | |        | | "); 
    String l13 = new String(" | |  ---------------  | | "); 
    String l14 = new String(" | |  ===============  | | "); 
    String l15 = new String(" | |        | | "); 
    String l16 = new String(" | |        | | "); 
    String l17 = new String(" | |  ---------------  | | "); 
    String l18 = new String(" | |  ===============  | | "); 
    String l19 = new String(" | |        | | "); 
    String l20 = new String(" | |        | | "); 
    String l21 = new String(" | |        | | "); 
    String l22 = new String(" | |        | | "); 
    String l23 = new String(" ) |_____________________________| ( "); 
    String l24 = new String("/ \\       / \\ "); 
    String l25 = new String("(_______)       (_______) "); 


    String[] lineholder = {l0,l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15,l16,l17,l18,l19,l20,l21,l22,l23,l24,l25}; 


    StringBuilder sb = new StringBuilder(); 

    for(int i=0 ; i < lineholder.length; i++) 
    { 
    sb.append(lineholder[i] + "\n"); 
    } 

    JOptionPane.showMessageDialog(null, sb.toString()); 

    System.out.println(sb.toString()); 


    System.out.println("\n\n\n//In Your Best Robot Voice");//Intentionally left comment break visible for effect 
    System.out.println("End Of Program"); 


    } 
} 

有什么建议吗?再次感谢。

+0

你能分享畸形输出的截图吗? – Mureinik 2014-09-13 12:10:12

回答

0

您的问题可能是字体之一,因为JOptionPane不会将数据显示为需要的等宽字体。

一种选择是你设置的字体等宽使用一个JTextArea:

JTextArea tArea = new JTextArea(lineholder.length, 50); 
    tArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 10)); 
    tArea.setText(sb.toString()); 
    JScrollPane scrollPane = new JScrollPane(tArea); 
    //!! JOptionPane.showMessageDialog(null, sb.toString()); 
    JOptionPane.showMessageDialog(null, scrollPane); 

理论上你可以通过

UIManager.put("OptionPane.font", new Font(Font.MONOSPACED, Font.PLAIN, 10)); 

设置JOptoinPane的字体,但我无法得到这工作。


编辑,或者如果你想摆脱JScrollPane的的(习惯,我使用它),白色背景:,

JTextArea tArea = new JTextArea(lineholder.length, 50); 
    tArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 10)); 
    tArea.setText(sb.toString()); 
    tArea.setOpaque(false); 
    JOptionPane.showMessageDialog(null, tArea); 

一如往常如果有什么在这个答案让你感到困惑,或者如果它不能完全回答你的问题,那么请发表评论,询问这个问题的澄清。

+0

这就是它的气垫船,谢谢!如果我可以回顾一下,以便进一步理解这里完成的工作: – 2014-09-13 20:04:23

+0

控制台以等宽字体打印,JOptionPane默认使用非等宽字体,这导致了我的ASCII艺术的改变。理论上,我们可以将JOptionPane字体更改为等宽字体,但出于某种原因,这对您不起作用。相反,我们创建了一个带有(行,列)构造函数的JTextArea。然后,我们通过传入一个由(font facename MONOSPACE,style PLAIN,size 10)构造的新字体对象来设置JTextArea的字体。然后,我们将填充的等宽不透明的JTextArea传递给JOptionPane的showMessageDialog。那是对的吗? – 2014-09-13 20:19:43