paint()以外でサブ関数を作りたい

このQ&Aのポイント
  • java初心者の方がpaint()以外でサブ関数を作成したいとのことです。
  • しかし、うまく実行できないようで、public void paint(Graphics g)内に書くと正常に表示されるようです。
  • 質問者は、public void paint(Graphics g)の中身と同じ内容の別名のサブ関数を作成しましたが、うまくいかず、エラーが出てしまいます。原因を教えてください。
回答を見る
  • ベストアンサー

paint()以外でサブ関数を作りたい

 今晩は、java初心者です、宜しくお願いします。  下の様なウインドウに文字を書くサブ関数を作りましたが、うまく実行出来ません。  しかし、public void paint( Graphics g){ }の中に書いてやるとうまく文字が表示されます。  何故か理由が分かりません。  public void paint( Graphics g ){ }は、Componentクラスのメッソドをオーバーライドしている だけなので、別名のサブ関数で「Graphics g」を引数にとれば同じ考えだと思うのですが、 実行出来ない理由が理解できません。  public void drawLetter( Graphics g )としても、エラーが出るばかりです。  その原因が分かりません、宜しくお願いします。 ==================================================================== public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } ============================================================= public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; drawLetter( ) ; } public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; /* g.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; g.setColor( Color.BLUE ) ; g.drawString( "Orbit" , 50 , 50 ) ; */ } } =======================================================================

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

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

  • ベストアンサー
noname#177743
noname#177743
回答No.3

> しかし、「drawLetter( aa );」と書くと、「java.lang.NullPointerException at P1.paint(P1.java:76)」というエラーが出ます。 ですから、drawLetter(g); です。drawLetter( aa );でもdrawLetter( Graphics aa );でもなく、drawLetter(g); です。先の回答にも書いたはずですが。なぜdrawLetter( aa );とかわざわざ間違った文を書いてエラーを起こすのですか。drawLetter(g);に修正して試してみてください。

その他の回答 (2)

noname#177743
noname#177743
回答No.2

>drawLetter( Graphics aa );の箇所でエラーが出ています。 そんな書き方はJavaにはありません。drawLtetter(g);です。インスタンスgを引数に渡して呼び出すのですから。drawLetter( Graphics aa );では文法からしておかしいでしょう。 どうも描画の仕組み云々以前の問題として、Javaの基本がよく理解できていないようですね。先へ進む前に、もう少し基礎から勉強しなおしたほうがよいと思いますよ。

dikon_007
質問者

お礼

 回答有難うございます。  何とか実行することが出来ました。  ところで下の二つのプログラムで、Graphicsのインスタンスのbbに対する考え方はどのように違うのでしょうか。  両方とも実行可能プログラムです。  宜しくお願いします。 ========================================================================== public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; } public void drawLetter( Graphics bb ) { bb.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; bb.setColor( Color.red ) ; bb.drawString( "String" , 30 , 30 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; drawLetter( g ) ; } } ================================================================================== public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; } public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.red ) ; aa.drawString( "String" , 30 , 30 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; drawLetter( ) ; } } ============================================================================

dikon_007
質問者

補足

 仰るとおりです。  しかし、「drawLetter( aa );」と書くと、「java.lang.NullPointerException at P1.paint(P1.java:76)」というエラーが出ます。  少なくとも、「drawLetter( Graphics aa );」ではエラーがでなかったので、走らせてみました。  宜しくお願いします。

noname#177743
noname#177743
回答No.1

実行されないわけではないと思います。実行されているが、そのあとでpaintが呼び出されるので無意味だ、というだけです。init内でdrawLetterを呼び出しても、initの処理が完了しアイドル状態に戻る段階で画面を更新するイベントによりpaintが呼び出され、それまでの表示はすべて一度消去され、改めてpaintの内容が描かれます。ですから、実行されていたとしても無意味なのです。 画面の描画は、必要が生じた時に表示の更新イベントが発生し、それによりシステムがpaintメソッドを呼び出して最終的な表示を作成します。ですから、paintメソッドをオーバーライドして描画処理を用意するのです。 どうしても処理を分離したいならば、public void drawLetter(Graphics g)というように定義し、paintメソッの最後にdrawLetter(g)というように呼び出して処理すればいいでしょう。なお、その場合にはgetGraphicsではなく引数で渡されたGraphicsを使って描画をします。

dikon_007
質問者

補足

 chiiba_kunさん、回答有難うございます。  下のように修正しましたら、他の画像も全く表示されなくなりました。  drawLetter( Graphics aa );の箇所でエラーが出ています。  何故でしょうか。  そもそもこの「Graphics aa」がどのようなものかも(aaのオブジェクト自体がどのような機能を実行して いるのかが)良く分かってないのですが。  再度宜しくご教示お願い致します。 //=========================================================================== public class P1 extends Applet { Graphics aa = getGraphics() ; public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; // drawLetter( ) ; } public void drawLetter( Graphics bb ) { bb.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; bb.setColor( Color.red ) ; bb.drawString( "String" , 30 , 30 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; drawLetter( Graphics aa ) ; } } //===========================================================================

関連するQ&A

  • フォントの使用方法

    次のプログラムでフォントを変更できるはずなのですが・・・。 ※import文省略 public class StringDisplay extends Applet{  public void paint(Graphics g) {   g.drawString("文字が書けました",100, 50);   g.setFont(new Font("MS 明朝", Font.PLAIN, 25));   g.drawString("文字が書けました",100,100);   g.setFont(new Font("MS ゴシック", Font.BOLD, 30));   g.drawString("文字が書けました",100,150);  } } --実行結果-- ・MS明朝及びMSゴシックにならない ・「文字が書けました」は3つとも出ている ・3つとも初期設定フォントの「dialog」らしい ・文字の大きさは変更されている ・3つ目に太字は適用されている ・他のアプリケーション(キューブペイントなど)で文字を書くときにはMS明朝・MSゴシックは使用できる こんな感じなのですが、なぜフォントが変更できないのかが分かりません。 全く同じプログラムではありませんが、以前はちゃんと変更できました。 どなたかお分かりになる方はいませんでしょうか?

    • ベストアンサー
    • Java
  • ペイント時のチラツキ予防方法について

    現在、下記のpaint関数がrepaint関数を使って50ミリ秒きざみで呼ばれます。すると、画面がチラツクのです。 良い方法はありませんでしょうか? ちなみにdrawImageしている絵は最初の一回だけ描画して、 その絵の上にdrawStringを使ってミリ秒単位で字が書かれるのです。 ************************************************** public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("Song_ng"); }else{ //A描画 g.setColor(Color.black); g.setFont(FontA); g.drawString(strTitleA, 90, 25); //B描画 g.setColor(Color.black); g.setFont(FontB); g.drawString(strTitleB, 5, 55); //C描画 g.setColor(Color.black); g.setFont(FontC); g.drawString(strTitleC, 15, 85); //D描画 g.setColor(Color.black); g.setFont(FontD); g.drawString(strTitleD, 105, 120); } } ************************************************* 私なりに画面のチラツキ防止のためにupdate関数を下記のように修正したのですが、チラツキが良くはなりません。 ************************************************* public void update(Graphics g){ paint(g); } *************************************************

    • ベストアンサー
    • 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
  • 文字列の表示

    Graph2クラスで作った文字と直線をMainFrameクラスで作ったフレームに表示させたいのですが、フレームが作成されるだけで文字と直線が表示されません。どうすれば表示されるのか是非教えてください。お願いします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class Graph1 { public static void main(String argv[]) { MainFrame MF = new MainFrame(); MF.setVisible(true); } } class MainFrame extends Frame { public MainFrame() { setLocation(500 , 200); setTitle("MainFrame"); setSize(500 , 300); setLayout(null); //Graph2 aGraph2 = new Graph2(); //aGraph2.show(); addWindowListener(new MyWinL()); } private class MyWinL extends WindowAdapter { public void windowClosing(WindowEvent e) { System.out.println("終了しました。\n"); System.exit(0); } } } class Graph2 extends JApplet { public void paint(Graphics g) { g.setColor(Color.GRAY); for (int i=0; i < 5; i++) { g.drawLine(0, 50*i, 400, 50*i); } for (int i=0; i < 9; i++) { g.drawLine(50*i, 0, 50*i, 200); } Font font1 = new Font("Serif" , Font.PLAIN,30); Font font2 = new Font("SansSerif" , Font.PLAIN,30); Font font3 = new Font("MS P明朝" , Font.PLAIN,30); Font font4 = new Font("MS Pゴシック" , Font.PLAIN,30); g.setColor(Color.RED); g.setFont(font1); g.drawString("Hello! Java world!", 50, 50); g.setFont(font2); g.drawString("Hello! Java world!", 50, 100); g.setColor(Color.BLUE); g.setFont(font3); g.drawString("Hello! Java world!", 50, 150); g.setFont(font4); g.drawString("Hello! Java world!", 50, 200); }; }

    • ベストアンサー
    • Java
  • public void paint(Graphics g){

    public void paint(Graphics g){ g.setColor(new Color(ci, ci, ci)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.WHITE); g.drawString("Canvas表示", 20, 20); g.drawImage(image, x1, y1, this); g.drawImage(image1, x2, y2, this); } public void update(Graphics g){ paint(g); } public void run(){         //while(true)で永久ループ //imageの座標を変更する処理         //repaint();     } スレッドを使ってイメージの座標を変更し、イメージが動くプログラムを作りました。 これだと滑らかに動かないからpaintメソッドをもうひとつ作って 処理するpaintと描画するpaintとにわけたらいいと言われました。 ですがやりかたがわからないので教えてください。

  • drawStringの座標について

    paintメソッド内で、drawStringで文字列を、 drawImageで画像をそれぞれ表示しています。 drawStringとdrawImageの両方で、同じ座標を 指定しても表示位置がずれます。x座標は ぴったり一致するのですがy座標が7から8ポイント ほどずれます。この二つのメソッドによる座標 と表示位置を一致させたいのですが、よい方法は ありませんでしょうか。どうぞよろしくお願い いたします。 public void paint(Graphics g) { g.drawImage(image,20,20,100,20); Font fnt=new Font("HGゴシックM",Font.PLAIN,12); g.setFont(fnt); g.drawString("Hello",20,20);//座標値はおなじで               も表示位置がずれる }

    • ベストアンサー
    • Java
  • Fontの指定ができず困っています。

     フォントを設定し、文字を表示させる以下のようなプログラムを作 成しました。しかし、コンパイルするとエラーが表示されます。 --------------------------------------------------------- import java.applet.*; import java.awt.*; public class moji extends Applet{ public void paint(Graphics g){ Font fnt = new Font("Serif",Font.BOLD,18); g.setFont(fnt); g.drawString("Hello Java",10,10); } } --------------------------------------------------------- エラーの内容は以下の通りです。 --------------------------------------------------------- moji.java:5: シンボルを見つけられません。 シンボル: 変数 BOLD 場所 : Font の クラス Font fnt = new Font("Serif",Font.BOLD,18); ^ moji.java:5: 内部エラーです。Font.<init> を Font で () にイン スタンス生成できません。 Font fnt = new Font("Serif",Font.BOLD,18); ^ moji.java:6: setFont(java.awt.Font) (java.awt.Graphics 内) を (Font) に適用できません g.setFont(fnt); ^ ---------------------------------------------------------  なぜ、このようなエラーがでるのか教えていたたでないでしょう か?よろしくお願いします。

    • ベストアンサー
    • Java
  • 画面のちらつきの原因が知りたいです

    JAVAの初心者です、宜しくお願いします。 下のようなプログラムを書きました。 「public void paint(Graphics g){ ~ repaint();」とすると、画像がちらつきます、しかし、「repaint();」を消すとちらつかなくなります、この原因が分かりません。 一体何故このような現象が起こるのでしょうか、宜しくお願いします。 ========================================================== import java.applet.Applet; import java.awt.Button; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class Oval_Rec_1_071128 extends Applet implements MouseListener , ActionListener { int x1 ; int y1 ; int xh = 50 ; int yv = 50 ; Button bt1 ; Button bt2 ; public void actionPerformed(ActionEvent ae){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void init() { setBackground(Color.yellow); addMouseListener(this); bt1 = new Button("push"); bt1.setFont(new Font("SansSerif", Font.BOLD, 20)); bt1.setBackground(Color.black); bt1.setForeground(Color.lightGray); add(bt1); bt1.addActionListener(this); bt2 = new Button("change_circle"); add(bt2); bt2.addActionListener(this); } public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); xh = e.getX(); yv = e.getY(); // repaint(); //comment out } public void paint(Graphics g) { g.setColor(Color.red); g.setFont(new Font("Serif",Font.BOLD,24)); g.drawString("Hello Applet World ! !" , 50 , 50); g.setColor(Color.blue); g.drawLine( 100 , 100 , 500 , 500); g.setColor(Color.cyan); g.fillOval( x1 , y1 , xh , yv); g.setColor(Color.magenta); g.fillRect( xh , yv, x1/10 , y1/10 ); repaint(); } }

    • ベストアンサー
    • Java
  •  paint( )メッソドをオーバーロードについて

     paint( )メッソドをオーバーロードについて  今晩は、JAVA初心者です、宜しくお願いします。  paint( )メッソドをオーバーロードする時に、<< A >>のコードはそのまま、  g.drawStringを書いていますが、<< B >>のコードでは、  super.paint( )で親クラスを呼んでやらないと、エラーになります。  この両者の違いが全く理解出来ません、どこがどのように違うのでしょうか。  宜しくお願い致します。 ======================================== << A >> public class Sample extends Applet { public void paint(Graphics g) { g.drawString("Applet",50,50); } } ======================================= << B >> public class JFrame_Test extends JFrame { JFrame_Test() { setSize(400,300); setTitle("JFrame_Test"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",70,70); } public static void main(String[] args) { JFrame jf = new JFrame_Test(); jf.setVisible(true); } } ========================================

    • ベストアンサー
    • Java
  • 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) 'ここまで これらの数値を右揃えで印刷したい場合、どのようにコードを記述したらよいのか、アドバイスを願います。上記のコードよりももっとスマートなコード記述で、私が望んでいる様な印刷結果を実現できるようでしたら、ご教授のほどよろしくお願いいたします。