Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(JTextAreaの内容を印刷すると文字化けする。)
閲覧数:1545
掲示板(JTextAreaの内容を印刷すると文字化けする。)
名前
題名 JTextAreaの内容を印刷すると文字化けする。
質問内容

質問を評価する
(0ポイント)
JTextAreaの内容を印刷すると、文字化けします。(しないときもある。)
SwingでGUIを作り、グラフィックスとテキストが混在したものを画面に表示すると問題ないのですが、印刷すると文字化けする事が多々あります。
例えば「a漢字漢字漢字」は画面と同じように印刷されますが、「a漢字漢字漢字漢字」とすると漢字が文字化けします。

環境は JDK1.7 windowsXPです。

以下、確認用のプログラムです。
起動後、画面左のJTextAreaに文字を入力し、PRINTボタンを押すと画面右のJpanelには正しく表示しますが、
印刷結果は文字化けします。
なぜ???行き詰っています。

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class PrintTest extends JFrame {
    PageFormat pf;// プリント用ページフォーマット
    JPanel panelChk = new JPanel(); // 印刷内容確認表示用パネル

    public static void main(String[] args) {
        new PrintTest();
    }

    PrintTest() {
        setLayout(new FlowLayout(FlowLayout.CENTER, 0, 30)); // ←配置
        setSize(400, 300); // ← フレームサイズ指定
        setVisible(true); // ← フレーム可視状態
        try {
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
                @Override
                public void run() {
                    setLayout(null);
                    textArea.setBounds(10, 30, 150, 150);// 文字列入力用エリア
                    textArea.setLineWrap(true);// 入力文字列が端まできたら折り返す。
                    add(textArea);

                    panelChk.setBounds(200, 30, 150, 150);
                    panelChk.setBackground(Color.WHITE);
                    add(panelChk);

                    JButton btnPrint = new JButton("PRINT");// 印刷実行ボタン
                    btnPrint.setBounds(50, 200, 80, 25);
                    add(btnPrint);

                    btnPrint.addActionListener(new ActionListener() {// ボタンが押されたら
                        @Override
                        public void actionPerformed(ActionEvent arg0) {
                            textArea.print(panelChk.getGraphics());// 印刷内容をpanelに出力
                            // 印刷準備
                            PrinterJob pj = PrinterJob.getPrinterJob();
                            pf = new PageFormat();
                            Paper paper1 = pf.getPaper();
                            paper1.setImageableArea(0, 0, 500, 800);
                            paper1.setSize(500, 800);
                            pf.setPaper(paper1);
                            pj.setPrintable(new myPrint(), pf);

                            try {
                                pj.print();// 印刷リクエスト
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        repaint();
    }

    static JTextArea textArea = new JTextArea(); // テキスト入力エリア

    class myPrint implements Printable {
        @Override
        public int print(Graphics g, PageFormat fmt, int pageNum) {
            if (pageNum != 0) // 2ページ目以降は無し
                return NO_SUCH_PAGE;
            g.translate(15, 15); // 余白のための移動
            textArea.print(g); // 印刷
            return PAGE_EXISTS;
        }
    }

}



 
質問日時 2013-03-26 12:27:13
名前
回答内容

回答を評価する
(0ポイント)
もし、論理フォント以外を設定すると問題ない、
Java6 なら問題ない、とすれば Java7 のバグかもしれません。
回答日時 2013-03-26 13:51:26
名前
回答内容

回答を評価する
(0ポイント)
仙人 様

ありがとうございます!
解決しそうです。

物理フォントを指定して、今までダメだった
パターンをいくつか試した限りではOKでした。
もう少しいろいろやってみないと最終的な判断は出来ませんが取り急ぎ、ご報告方々、御礼まで。
回答日時 2013-03-28 14:56:52
名前
回答内容

回答を評価する
(0ポイント)
個人的にはバグだと思っています。
ただ、バグレポートを書き込みましたが反応無しです。
Java6 に戻すか、物理フォントを設定するかが当面の対応策でしょう。
回答日時 2013-03-29 01:48:35
名前
回答内容

回答を評価する
(0ポイント)
その後、いろいろと試してみました。
java6には事情があって戻せないのでフォント指定について試したところ、
物理フォントを指定した場合は、試した範囲内では全てOKでした。
論理フォント指定の場合、monospacedはOKでしたが、selifはNGでした。
selifでは、(Times New Roman/MS Mincho)がマッピングされていたので、MS Minchoを物理フォントに指定してみたところ、こちらはOKでした。
やはり、論理フォントを指定した時(物理フォントを指定しない時)に問題が起こるようですね。
いずれの場合でも、画面にはちゃんと表示できているので仙人様ご指摘のとおりバグと考えるの自然なように思えます。
何はともあれ、アドバイス頂いた物理フォントを指定という策で、問題を回避できる見通しが立ちましたので、
大変助かりました。改めて御礼申し上げます。今後、何か有用な発見があれば、こちらに投稿させて頂きます。
回答日時 2013-03-29 09:59:59

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道