Проблема заключается в том, что используемые шрифты заключаются в том, что JOptionPane по умолчанию не отображает текст в моноширичном шрифте. Вы можете убедиться в этом сами, изменив шрифт, используемый для JOptionPane:
import javax.swing.*;
import java.awt.*;
public class Problem {
public static void main(String[]args){
String output = " Multiplication Table\n";
output+= " ------------------------------------\n";
output+=" | ";
for(int j = 1;j<=9;j++)
output+= j +" ";
output+= "\n";
for(int i = 1 ; i<=9;i++){
output+= i + "|";
for(int j = 1;j<=9;j++){
output+=String.format("%4d", i * j);
}
output+="\n";
}
System.out.println(output);
JOptionPane.showMessageDialog(null, output); // non-monospaced font
JTextArea textArea = new JTextArea(output);
textArea.setFocusable(false);
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
textArea.setBorder(null);
textArea.setBackground(null);
JOptionPane.showMessageDialog(null, textArea); // displaying a monospaced font
}
}
2-й JOptionPane отображает как:
Обратите внимание, что шрифты JOptionPane будут определяться тем, что Look & Feel использует в вашей программе. Вы можете указать L & F использовать указанный c шрифт, используя UIManager для изменения шрифта сообщения по умолчанию, используемого JOptionPane. Например, если вы сделаете вызов ниже, то JLabels, используемый JOptionPane (здесь JOptionPane создает несколько строк JLabel, отображаемых в JPanel с использованием GridLayout) для любого шрифта:
UIManager.put("OptionPane.messageFont", new Font(Font.MONOSPACED, Font.PLAIN, 12));
JOptionPane.showMessageDialog(null, output); // non-monospaced font