Почему JOptionPane показывает другой вывод по сравнению с System.out.println () ;? - PullRequest
0 голосов
/ 01 марта 2020

Я пытался создать таблицу умножения с помощью System.out.println (); и это было отлично отформатировано; однако, когда я попытался изменить его на функцию JOptionPane, результаты были неудовлетворительными. Вот System.out.println (); код:

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

Вот вывод:

 Multiplication Table
  ------------------------------------
 |   1   2   3   4   5   6   7   8   9   
1|   1   2   3   4   5   6   7   8   9
2|   2   4   6   8  10  12  14  16  18
3|   3   6   9  12  15  18  21  24  27
4|   4   8  12  16  20  24  28  32  36
5|   5  10  15  20  25  30  35  40  45
6|   6  12  18  24  30  36  42  48  54
7|   7  14  21  28  35  42  49  56  63
8|   8  16  24  32  40  48  56  64  72
9|   9  18  27  36  45  54  63  72  81

Но изменение System.out.println (вывод); на JOptionPane.showMessageDialog (null, output); Дает запутанный формат, плохо выровненный, по сравнению с System.out.println (); Я не знаю, как скопировать вывод из JOptionPane, но это выглядит примерно так:

1| 1 2 3 4 5 6 7 8 9
2| 2 4 6 8 10 12 14 16 18
3| 3 6 9 12 15 18 21 24 27
4| 4 8 12 16 20 24 28 32 36
5| 5 10 15 20 25 30 35 40 45
6| 6 12 18 24 30 36 42 48 54
7| 7 14 21 28 35 42 49 56 63
8| 8 16 24 32 40 48 56 64 72
9| 9 18 27 36 45 54 63 72 81

1 Ответ

2 голосов
/ 01 марта 2020

Проблема заключается в том, что используемые шрифты заключаются в том, что 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 отображает как:

enter image description here


Обратите внимание, что шрифты 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
...