質問内容
質問を評価する
(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; } }
}
|