Swingで印刷

このQ&Aのポイント
  • Swingで作ったボタンを押したらリストに表示されている文字が印刷される方法を考えています。
  • リストに表示された文字を座標に印字する方法を知りたいです。
  • TestSampleクラスでPrintボタンを押すと、PrObjectクラスのprintメソッドが呼ばれて印刷が実行されます。
回答を見る
  • ベストアンサー

Swingで印刷

Swingとprintパッケージを勉強し始めたばかりです。 Swingで作ったボタンを押したらリストに表示されている文字が印刷されるというのを考えています。 ボタンを押してdrawStringを使っての文字(ここではHelloとゆう文字)の印刷はわかるのですが、リストに表示された文字をひっぱりだしてきて印刷とゆうのがわかりません。 例えばリストの「東京都」を座標の(100,200)に印字するといった感じです。 「大阪府」は1行ずらして印刷としようと考えています。 よろしければご教授お願いいたします。 public class TestSample extends JFrame implements ActionListener{ 略 public TestSample(){ String[] str={"東京都","大阪府"}; JButton Print=new JButton("Print"); 略 } public void actionPerformed(ActionEvent e){ 略 if(s.equals("Print")==true){ PrObject pobj=new PrObject(); PrinterJob pjob=PrinterJob.getPrinterJob(); PageFormat fmt=pjob.defaultPage(); pjob.setPrintable(pobj,fmt); try{ pjob.print(); } catch(Exception ex){ System.err.println(ex); }}} class PrObject implements Printable{ public int print(Graphics g,PageFormat fmt,int pageIndex){ if(pageIndex>0){ return Printable.NO_SUCH_PAGE; } else { Graphics2D g2d=(Graphics2D)g; g2d.drawString("Hello",100,200); return Printable.PAGE_EXISTS; }}}}

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

考え方はいたってシンプルで印刷する文字列が可変であるようにすれば良いだけです。今回のソースで考えるとPrObjectクラスに文字列のメンバを持たせ、外部から変更出来るようにします。そして、文字列が複数の場合も対応出来るように変更します。 簡単に変更例を書いておきます。理解出来たら自分のやりたいように変更してみて下さい。 class PrObject implements Printable{ private String[] printStrings = null; // メンバ追加 public void setPrintStrings(String[] strs){printStrings = strs;} // メソッド追加 public int print(Graphics g,PageFormat fmt,int pageIndex){ if(pageIndex>0){ return Printable.NO_SUCH_PAGE; } else { Graphics2D g2d=(Graphics2D)g; if(printStrings != null){ // ここから変更 for(int i = 0; i < printStrings.length; i++){ g2d.drawString(printStrings[i],100,200 + (g.getFontMetrix().getHeight() * i)); }} // ここまで return Printable.PAGE_EXISTS; }}}} -- 変更部抜粋 --- PrObject pobj=new PrObject(); pobj.setPrintStrings(str); // 追加 PrinterJob pjob=PrinterJob.getPrinterJob();

akigiri0213
質問者

補足

お返事ありがとうございます! おかげさまでイメージが沸きました(?) んが、コンパイルするとエラーが出ます。 --------------------------- シンボルを解決できません シンボル:変数str 場所:SwingTestクラス pobj.setPrintStrings(str); --------------------------- pobj.setPrintStrings(str)でリストの値をセットして、class PrObjectに渡している…というのはわかるのですが… なぜシンボルがないとか言われるんですかね… アホゥな質問で申し訳ないです(--;) 後々、(ファイル開いて、それをリストに追加)model.addElement(str)を使ってリスト表示したものを印刷出来たらなと考えています。 その場合もsetPrintStrings(str)でいいのでしょうか? それともこの場合はsetPrintStrings(model)になるのでしょうか? 実際試してみたら適用できませんとエラーが出ました。 よろしければもう少しヒントをお願いします。

その他の回答 (1)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

#1です。 ソースをよく見ていなかったのでstrのスコープ(有効範囲)を正しく把握していませんでした。 >String[] str={"東京都","大阪府"}; を >public TestSample(){...} の外に出して下さい。こんな感じで・・・ String[] str={"東京都","大阪府"}; public TestSample(){ 略 }

akigiri0213
質問者

お礼

すいません出来ました; ありがとうございました! 書き方間違えていました;

akigiri0213
質問者

補足

何度も申し訳ないです(--;) コンパイルは成功しましたが、いざ印刷ボタンを押したらこんなの出ました。 java.awt.print.PrinterException: No page or printable exists. これはデータが無い、渡されていないと解釈してよいのでしょうか?

関連するQ&A

  • 値をセットしたい

    Swingで「開くボタン」と「印刷ボタン」を作りました。 カンマ区切りのtxtファイルを開き、必要な項目だけリスト(DefaultListModel使ってます)表示。 印刷ボタンを押して印刷というのを作りたいのですが、リストに表示されたデータ等をPrObjectに渡せなくて困っています。 ※1のところでリストに表示されているデータをString[]のhakoに入れ、※2でセットして、と思っているのですが※1で互換性のない型とエラーが出ます。 初心者なもので行き詰ってしまいました。 アドバイス、ヒント、ツッコミなんでもいいのでよろしくお願いします。 public class SwingTest extends JFrame implements ActionListener { 略 public SwingTest(){ JButton Open = new JButton("開く"); //ボタン JButton Print1 = new JButton("印刷"); //ボタン 略 } public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); if(s.equals("Open")==true){  //開く 略 while ((line=br.readLine()) != null) { String[] token = line.split(","); String str = token[16] + " "+ token[19]; model.addElement(str); } 略 if(s.equals("Print1")==true){ //印刷 String[] hako; //※1 for (int i = 0; i < model.getSize(); i++){ hako[i] = (model.getElementAt(i)); } PrObject pobj = new PrObject(); pobj.setPrintStrings(hako); //※2 略 pjob.setPrintable(pobj,fmt); 略 }}} class PrObject implements Printable{ private String[] printStrings = null; public void setPrintStrings(String[] strs){printStrings = strs;} public int print(Graphics g,PageFormat fmt,int pageIndex){ if(pageIndex>0){ drawString略 }}} }

    • ベストアンサー
    • Java
  • アプレットで印刷

    アプレットで画像を印刷することは可能でしょうか? Graphics2DでdrawStringやdrawRectで文字や図形などは印刷できたのですが、drawImageができないので教えてください。 画像はImage img = Toolkit.getDefaultToolkit().getImage("img.gif")で読み込んでいます。 分かる方よろしくお願いします。

  • JButtonの画像をactionPerformedメソッド内で再描画

    JButtonの画像をactionPerformedメソッド内で再描画したい。 以下のソースのようにして、再描画したいのです。 setIconメソッドではなく、 JButtonに対して描画したものに対して再描画したいです。 Graphics2DクラスについてJAVA APIで調べましたが、 仕組の理解に至りませんでした。 仕組みと方法を教えて頂きたいです。 よろしくお願いいたします。 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; public class test extends JFrame implements ActionListener{ JButton b= new JButton(); public static void main(String a[]) { new test(); } public test() { super(); this.setSize(100,100); b.addActionListener(this); b.add(new Zoom(new ImageIcon("img1.jpg"),0,0,50,50)); this.add(b); this.setVisible(true); } class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); ////////////////////////////////// //画僧を再描画したい。 //g2.clearRect(0, 0, 80, 80);//× g2.drawImage(icon.getImage(), x, y, w, h, this); } } public void actionPerformed(ActionEvent e) { if(e.getSource()==b){ System.out.print("ok"); //this.repaint();//× //b.repaint();//× b.add(new Zoom(new ImageIcon("img2.jpg"),0,0,50,50));//(再描画できない) //b.setIcon(new ImageIcon("img2.jpg"));//ok(再描画出来る) } } }

    • ベストアンサー
    • Java
  • java初心者です。座標取得と図形表示について

    マウスをクリックするとその座標を表示するプログラムです。 画面には常に二つの四角形が表示されていて、どこをクリックしたかによって表示が変わるというものです。 (オレンジの四角形内をクリックした場合、 X:100 オレンジ Y:100 オレンジ のように表示します。) ですが、私が組んでみたプログラムでは図形表示が一瞬だけになってしまいます。 また、ウインドウの大きさを動かしてみると一瞬移っては消えてしまうという状態です。 それから、「オレンジ」などの日本語表示がうまくいかず「□□□」のように表示されてしまいます。 これらの問題を解決するにはどこをどう修正したらよいでしょうか? 以下が初心者なりに組んでみたソースです。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.Toolkit; import java.awt.Graphics2D; import java.awt.Graphics; import java.awt.Font; import java.awt.Rectangle; import java.lang.String; import java.lang.System; import javax.swing.JFrame; import javax.swing.JPanel; public class kadai33 extends JFrame { private static final long serialVersionUID = 1L; public kadai33() { add(new DrawPanel()); } public static void main(String[] args) { Toolkit.getDefaultToolkit().setDynamicLayout(true); JFrame f = new kadai33(); f.setTitle("マウスの座標を表示"); f.setDefaultCloseOperation(EXIT_ON_CLOSE); f.setBackground(Color.WHITE); f.setSize(400, 750); f.setVisible(true); } class DrawPanel extends JPanel implements MouseListener { int x; int y; public DrawPanel() { setBackground(Color.white); addMouseListener(this); } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } public void paint(Graphics g) { Font font=new Font("Arial",Font.PLAIN,16); super.paintComponent(g); //super.paint(g); Graphics2D g1 = (Graphics2D)this.getGraphics(); Rectangle rect = new Rectangle(); rect.setRect(50,50,200,200); g1.setColor(Color.ORANGE); g1.fill(rect); Graphics2D g2 = (Graphics2D)this.getGraphics(); Rectangle rect2 = new Rectangle(); rect2.setRect(150,350,150,150); g2.setColor(Color.GREEN); g2.fill(rect2); Graphics2D g3 = (Graphics2D)this.getGraphics(); Rectangle rect3 = new Rectangle(); rect3.setRect(50,650,200,50); g3.setColor(Color.BLACK); g3.fill(rect3); if(x>=50 && x<=250 && y>=50 && y<=250){ super.paintComponent(g); String sx = String.format("X:%d", x); String sy = String.format("Y :%d", y); g.setFont(font); g.setColor(Color.BLACK); g.drawString(sx, 65, 670); g.drawString(sy, 65, 690); Graphics2D g4 = (Graphics2D)g; g4.setFont(font); g4.setColor(Color.WHITE); g4.drawString("オレンジ",120,670); g4.drawString("オレンジ",120,690); } if(x>=150 && x<=300 && y>=350 && y<=500){ super.paintComponent(g); String sx = String.format("X:%d", x); String sy = String.format("Y :%d", y); g.setFont(font); g.setColor(Color.BLACK); g.drawString(sx, 65, 670); g.drawString(sy, 65, 690); Graphics2D g5 = (Graphics2D)g; g5.setFont(font); g5.setColor(Color.WHITE); g5.drawString("グリーン",120,670); g5.drawString("グリーン",120,690); } else{ super.paintComponent(g); String sx = String.format("X:%d", x); String sy = String.format("Y :%d", y); g.setFont(font); g.setColor(Color.BLACK); g.drawString(sx, 65, 670); g.drawString(sy, 65, 690); Graphics2D g6 = (Graphics2D)g; g6.setFont(font); g6.setColor(Color.WHITE); g6.drawString("対象外",120,670); g6.drawString("対象外",120,690); } } } } 大変困っています。 どうかよろしくお願いいたしますm(__)m

    • ベストアンサー
    • Java
  • javaアプリのswingに関する質問です

    始めて投稿させていただきます。 現在、javaアプリケーションのswingを利用し、ボタンを押したら画像が表示され、ウエイトの時間を過ぎると自動的に画像が消え、またボタンが表示され・・・を繰り返すプログラムを作っています。 ですが、色々なサイトを拝見させていただき、修正を加えたのですが思うように動いてくれません。 そこで、皆様のお知恵を拝借出来ればと思い投稿させていただきました。 下記にソースコードを記載しております。 すべてのソースコードを記載しておりますので長くなっております。 また最終的には、50個前後のボタン、画像の拡大等を行う予定です。 長文になりますがアドバイスをいただけましたら幸いです。 -----------以下ソースコード-------------------- import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.*; class Test extends JPanel implements ActionListener{ static JFrame frame = new JFrame(); JButton bt1; JButton bt2; JPanel pn1 = new JPanel(); Dimension dim = this.getToolkit().getScreenSize(); int eventNo = -1; public Test() { frame.setTitle("これ"); frame.setUndecorated(true); frame.setBounds(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); frame.setVisible(true); } public void btStart(){ bt1 = new JButton("テスト"); bt2 = new JButton("終了"); pn1.add(bt1); pn1.add(bt2); bt1.addActionListener(this); bt2.addActionListener(this); } // ボタン消去メソッド public void btFormat(){ frame.remove(pn1); bt1 = null; bt2 = null; } public void actionPerformed(ActionEvent e){ if(e.getActionCommand() == "テスト") {eventNo = 1;} if(e.getActionCommand() == "終了") {eventNo = 46;} repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; if(eventNo == 46){ System.exit(0); }else if(eventNo == -1){ g2.clearRect(0, 0, 640, 480); }else if(eventNo >= 0){ eventNo = -1; btFormat(); try{ g2.drawImage(ImageIO.read(new File("./image/001.jpg")), 0, 0, this); frame.add(this); sleep(100); g2.clearRect(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); }catch(Exception e){ System.out.println(e); } } } // ウェイトを掛けるメソッド public synchronized void sleep(long msec) { for(int i=0; i<=msec; i++){ try { wait(1); } catch(InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add( new Test() ); } }

    • ベストアンサー
    • Java
  • ベクター図のボタンを作りたい

    javax.swing.JButtonでボタンを作って、そこにベクター図を埋め込みたいです。ドーすれば良いですか?サンプルプログラムを書いてくださったり、参考になりそうなホームページを紹介してくださると幸いです。 ボタンに文字(text)を埋め込む方法なら知ってます。ビットマップ図(.pngファイルなど)のアイコンを埋め込む方法も知ってます(ググればサンプルコードが沢山ヒットします)。しかし、ベクトルグラフィックスを埋め込むとなると、ハイレベルでしょうか? javax.swing.JButton maru=new JButton();//ボタンのインスタンス生成 void paint(java.awt.Graphics g){g.fillOval(100,100,100,100);}//位置のxyも短径長径も100ピクセルの楕円黒丸 maruボタンにsetText("●");とするのは簡単なのですが、やりたい事と少し違います。"●"は文字ですし、これだと半径の設定が厳しいです(フォントサイズを変えれば良いのでしょうが)。 やりたい事は、 maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));//半径100ピクセルの円をjava.awtで描いて、それをボタンに埋め込みたい  ↑ このコードはエラーになるんです。悲しいです。何とかして、エラーを回避して、maruボタンにfillOval(100,100,100,100)を埋め込みたいです。 ボタンに埋め込む図がベクター図なら、java.awt.Graphics以外の方法でも良いです。だけど、JavaのJButtonを使いますし、javaでベクトルグラフィックスの絵を描くとなるとjava.awt.Graphicsを使うでしょうし、 maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));みたいなプログラムが自然かなって思いました。 ***** (以下参考)試しにちょっと作ってみました。 class VectorButtonShitsumon extends java.awt.Frame{ public VectorButtonShitsumon(){setSize(500,500);setVisible(true);} public void paint(java.awt.Graphics g){g.fillOval(100,100,100,100);} public static void main(String[] args){ javax.swing.JFrame fr=new javax.swing.JFrame(); fr.setBounds(200,200,200,200); javax.swing.JButton maru=new javax.swing.JButton(); //maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));//←エラーコード maru.setText("●");//setTextは嫌! fr.getContentPane().add(maru,java.awt.BorderLayout.CENTER); new VectorButtonShitsumon(); fr.setVisible(true); }//end main }//end class VectorButtonShitsumon ここまで コメントを外したときのエラーメッセージ Exception in thread "main" java.lang.Error: Unresolved compilation problems: 型 AbstractButton のメソッド setIcon(Icon) は引数 (void) に適用できません 型 Graphics の非 static メソッド fillOval(int, int, int, int) を static 参照することはできません トークン "g" に構文エラーがあります。このトークンを削除してください

    • ベストアンサー
    • Java
  • GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。

    GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。 環境は、VC++のWin32プロジェクトです。 WindowのデバイスコンテキストからGraphicsオブジェクトを生成し、DrawStringとすると滑らかに描画されます。 しかし、BitmapオブジェクトからGraphicsオブジェクトを生成し、DrawStringを行うとビットマップフォントのようです。 Graphics g(hdc); g.DrawString(......); -> この場合はなめらか(画像の下の方) しかし、 Bitmap bmp(w, h, PixelFormat32bppARGB); Graphics g (&bmp); g.SetSmootingMode(SmoothingModeHighQuality); g.DrawString(...); -> ジャギが目立つ。(画像の上の方) ビットマップ(メモリ)にスムーズなテキストを描画することはできないのでしょうか? ちなみにフォントはメイリオです。

  • JButtonの座標(0,0)にアイコンをセット

    JButtonに以下のように、画像を書込む際、画像を一番は端(左上角)から乗せたいです。 つまり、ボタンの右上角(0,0)から乗せたいのです。 現状では、左端に隙間があいてしまいます。 この方法がご存知の方がおられましたら教えてください。 よろしくお願いいたします。 import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; public class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); g2.drawImage(icon.getImage(), x, y, w, h, this); } public static void main(String[] args) { ImageIcon icon = new ImageIcon("cherry.jpg"); Zoom zoom = new Zoom(icon,0,0,100,100); JButton b = new JButton(); JFrame f = new JFrame(); b.add(zoom); b.setPreferredSize(new Dimension(icon.getIconHeight(), icon.getIconWidth())); f.add(b); f.pack(); f.setVisible(true); } }

    • ベストアンサー
    • Java
  • javaについて質問

    import javax.swing.*; import java.awt.Color; import java.awt.Graphics; import java.awt.event.*; public class tt extends JFrame { public tt(){ setTitle("hogehoge"); setBounds( 10, 10, 300, 200); JButton btn1 = new JButton("続ける"); final JPanel p = new JPanel(); p.setBackground(Color.white); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event){ } } ); p.add(btn1); getContentPane().add(p); } public static void main(String[] args){ tt test = new tt(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); /* 実際に表示する */ } } Graphics g; g.drawString("ほげさんじょう",130,120);を追加しても コンパイルが通りません。 どうすれば画面に文字列を表示するんですか? あとテキストフィールドを追加するさいに、座標していとかして追加できないんですか?

  • Visual Studio .NET 2003:右揃え印刷の設定(その2)

    フォーム上に表示されている各項目を印刷したいのですが、左揃えの文字は普通に座標指定するだけで問題ないのですが、桁数の違う数字を右揃えで統一して印刷したい場合の方法を教えていただきたく、よろしくお願いいたします。 以前、上記の内容の質問をさせていただきましたところ、String.Formatを使えばよいとのご回答をいただきました。いろいろと調べてみたのですが、実際にどのようにコードに記述すればよいのかがわからずにおります。現在、フォーム上の項目のうち、数値が入力されている項目を印刷するためのコードを次のように記述しています。 '数値の印刷位置 e.Graphics.DrawString(Suuchi1.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 100) e.Graphics.DrawString(Suuchi2.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 150) e.Graphics.DrawString(Suuchi3.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 200) e.Graphics.DrawString(Suuchi4.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 250) e.Graphics.DrawString(Suuchi5.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 300) 'ここまで これらの数値を右揃えで印刷したい場合、どのようにコードを記述したらよいのか、アドバイスを願います。上記のコードよりももっとスマートなコード記述で、私が望んでいる様な印刷結果を実現できるようでしたら、ご教授のほどよろしくお願いいたします。

専門家に質問してみよう