• 締切済み

線の太さを変える コードのエラの意味が分かりません

 java勉強中の初心者です、宜しくお願いします。  下のようなコードを書きましたが、  >DrawPanel dp = new DrawPanel( X1 , Y1 , X2 , Y2 ) ;  >g2.setStroke( の二か所でエラーが出ています。 (エラーの内容はよく理解できません。) 一体どこが間違っているのでしょうか宜しくお願いします。 ================================================================= public class drawLine extends JApplet { int X1 = 20 , Y1 = 20 , X2 = 150 , Y2 = 150 ; public void init() { DrawPanel dp = new DrawPanel( X1 , Y1 , X2 , Y2 ) ; // dp.setSize( 30 , 200 ) ; // dp.setBackground( Color.cyan ) ; this.add( dp ) ; this.setBounds( 10 , 10 , 400 , 400 ) ; this.setBackground( Color.cyan ) ; this.setVisible( true ) ; } } //======================================================= class DrawPanel extends JPanel { Float currentWidth = 20.0f ; int x1 , y1 , x2 , y2 ; public DrawPanel( int x1 , int y1 , int x2 , int y2 ) { this.x1 = x1 ; this.y1 = y1 ; this.x2 = x2 ; this.y2 = y2 ; Graphics2D g2 = (Graphics2D)this.getGraphics() ; g2.setStroke ( new BasicStroke ( currentWidth , BasicStroke.CAP_ROUND , BasicStroke.JOIN_MITER ) ) ; g2.setColor( Color.red ) ; g2.drawLine( x1 , y1 , x2 , y2 ) ; } } ==============================================================================

みんなの回答

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.8

#5の回答にありますがinit()メソッドはアプレットが起動する前に初期化するタイミングとして 呼び出されるメソッドです。この段階でGraphicsの情報は取得できません。 アプレットを描画するタイミングではpublic void paint(Graphics g)が呼び出されます。 このpaint()メソッドは「何もしない」という実装になっているので、drawLineクラスで paint()メソッドをオーバーライドし、DrawPanelの表示を指示します。 public void paint(Graphics g){ dp.paint(g); } ※DalwPanelのオブジェクトdpが必要になりますのでinit()メソッドのローカル変数でなく DrawLineクラスのメンバ変数として宣言する必要があります。 またアプレットではpaint()メソッドを直接呼び出すのではなく、repaint()メソッドを 呼びます。repaint()メソッドがpaint()メソッドを呼び出し、適切なGraphicsオブジェクトを 渡してくれます。

dikon_007
質問者

お礼

 tekebonさん、回答有難うございました。  別の方法により、線を太くすることが出来ましたが、 ある特定の線だけに 「g2.drawLine( x , 200-100 , 350 , 150-100 ) ;」としてやりましたが、 全ての線に適用され全てが同じ線の太さになってしましました。 各線毎に太さを変えるためにはどのようにコードを書いてやれば 良いのでしょうか、宜しくお願いします。 ================================================================================= public class shachou extends Applet { MyCanvas mc ; public void init() { this.setBackground( Color.yellow ) ; this.setLayout( null ) ; this.setSize( 1000,400 ) ; this.setLocation( 150,150 ) ; mc = new MyCanvas(); mc.setLocation( 50 , 50 ) ; this.add(mc); this.setVisible(true); } } class MyCanvas extends Canvas { Graphics2D g2; MyCanvas() { this.setBackground( Color.cyan ) ; this.setSize( 500 , 300-125 ) ; } public void paint( Graphics g ) { int x ; g2 = (Graphics2D)g ; g2.setStroke(new BasicStroke(3.0f)) ; for( x = 50 ; x <= 250 ; x += 20 ) { g.setColor(Color.yellow); //scue g.drawLine( x , 200-100 , 150 , 150-100 ) ; } for( x = 250 ; x <= 450 ; x += 20 ) { g.setColor(Color.black); //scue g2.drawLine( x , 200-100 , 350 , 150-100 ) ; } g.setColor(Color.black); g.drawLine( 40 , 205-100 , 460 , 205-100 ) ; //base g.setColor(Color.magenta); //base g.drawLine( 40 , 198-100 , 460 , 198-100 ) ; for( x = 148 ; x <= 152 ; ++ x ) { g.setColor(Color.red); //virtical g.drawLine( x , 230-100 , x , 135-100 ) ; } for( x = 348 ; x <= 352 ; ++ x ) { g.setColor(Color.magenta); //virtical g.drawLine( x , 230-100 , x , 135-100 ) ; } } } ================================================================

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.7

Graphics2D g2 = (Graphics2D)this.getGraphics() ; が悪い これが理解できるようになると 描画の仕組みが分かるかもしれないわ

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.6

んー ここは教えてあげないと厳しいかしらね 次のメソッドをHINTにするといいわ @Override public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke(currentWidth, BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER)); g2.setColor(Color.red); g2.drawLine(x1, y1, x2, y2); } このpaintというメソッドのオーバーライドが何を意味するか理解できると どんどん作れるようになるかも?

dikon_007
質問者

お礼

色々試してみましたが、どうしてもうまく表示されません。 //=========================================================== public class drawLine extends JApplet { int X1 = 20 , Y1 = 20 , X2 = 50 , Y2 = 50 ; Graphics g ; public void init() { DrawPanel dp = new DrawPanel( X1 , Y1 , X2 , Y2 ) ; // dp.setSize( 30 , 200 ) ; // dp.setBackground( Color.cyan ) ; // this.add( dp ) ; this.setBounds( 10 , 10 , 400 , 400 ) ; this.setBackground( Color.cyan ) ; // dp.paint( g ); // this.add( dp ) ; // dp.paint( g ); this.setVisible( true ) ; // dp.makeLine( g ); this.add( dp ) ; dp.paint(g); // this.add( dp ) ; } } //======================================================= class DrawPanel extends JPanel { Float currentWidth = 20.0f ; int x1 , y1 , x2 , y2 ; Graphics g ; public DrawPanel( int x1 , int y1 , int x2 , int y2 ) { this.x1 = x1 ; this.y1 = y1 ; this.x2 = x2 ; this.y2 = y2 ; } // public void makeLine( Graphics g ) public void paint(Graphics g) { // super.paint(g); Graphics2D g2 = (Graphics2D)this.getGraphics() ; g2.setStroke ( new BasicStroke ( currentWidth , BasicStroke.CAP_ROUND , BasicStroke.JOIN_MITER ) ) ; g2.setColor( Color.red ) ; g2.drawLine( x1 , y1 , x2 , y2 ) ; } } //=====================================================================

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.5

と思ったけどよく見ると明らかね 悪いのはここ Graphics2D g2 = (Graphics2D) this.getGraphics(); thisは現在初期化中(コンストラクタ中)なので まだ描画されていないから Graphicsオブジェクトは取れないわ nullが返るのよ Graphics2D g2 = (Graphics2D)this.getGraphics() ; 以降を別のメソッドに記述して 最低でも描画処理対象になる this.add( dp ) ; か this.setVisible( true ) ; より後ろで実行しないとダメよ どっちが正解かは試してみて

dikon_007
質問者

お礼

回答有り難うございます。 this.add( dp ); dp.makeLine( ); を作成して、色々と位置を変えてみましたが、線はかけません。 エラーは出ていません。 ========================================================== public class drawLine extends JApplet { int X1 = 20 , Y1 = 20 , X2 = 150 , Y2 = 150 ; public void init() { DrawPanel dp = new DrawPanel( X1 , Y1 , X2 , Y2 ) ; // dp.setSize( 30 , 200 ) ; // dp.setBackground( Color.cyan ) ; // this.add( dp ) ; this.setBounds( 10 , 10 , 400 , 400 ) ; this.setBackground( Color.cyan ) ; // this.add( dp ) ; // dp.makeLine( ); this.setVisible( true ) ; // dp.makeLine( ); this.add( dp ) ; dp.makeLine( ); } } //======================================================= class DrawPanel extends JPanel { Float currentWidth = 20.0f ; int x1 , y1 , x2 , y2 ; public DrawPanel( int x1 , int y1 , int x2 , int y2 ) { this.x1 = x1 ; this.y1 = y1 ; this.x2 = x2 ; this.y2 = y2 ; } public void makeLine( ) { Graphics2D g2 = (Graphics2D)this.getGraphics() ; g2.setStroke ( new BasicStroke ( currentWidth , BasicStroke.CAP_ROUND , BasicStroke.JOIN_MITER ) ) ; g2.setColor( Color.red ) ; g2.drawLine( x1 , y1 , x2 , y2 ) ; } } ===========================================================================

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.4

drawLine.java の 46行目はどの処理かしら?

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.3

それはエラーの「場所」ですよね……。 こんな形ででてきませんか?  Exception in thread "~" java.~Exception:(説明)   at ……   at …… > 単純なエラーだろうと思い、分かる人が見ればすぐに発見できるだろうと思ってしまいました。 内容によってはすぐに発見できることもありますが、 ソースを隅から隅まで確認するのが正直めんどくさいので(私だけかもしれませんが) 出せる情報は小出しにせず全部出していただけると回答しやすいです。

dikon_007
質問者

お礼

すみません、一番上の行のエラーコメントがコピペ出来ていませんでした。 出し惜しみではないです。 宜しくお願いします。 =========================================================== java.lang.NullPointerException at DrawPanel.<init>(drawLine.java:46) at drawLine.init(drawLine.java:20) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) ===========================================================

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

本当にそれだけしか表示されないのですか? その前に何かありませんか?

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

そのエラーの内容を書いてほしいわ あなたが理解できなくても 私が理解できなくても 誰かが理解できるかもしれないもの

dikon_007
質問者

お礼

 すみません、エラーの内容を張ります。  単純なエラーだろうと思い、分かる人が見ればすぐに発見できるだろうと思ってしまいました。  ========================================================  at DrawPanel.<init>(drawLine.java:46) at drawLine.init(drawLine.java:20) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)  ========================================================

関連するQ&A