- 締切済み
線の太さを変える コードのエラの意味が分かりません
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 ) ; } } ==============================================================================
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- tekebon
- ベストアンサー率62% (36/58)
#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オブジェクトを 渡してくれます。
- askaaska
- ベストアンサー率35% (1455/4149)
Graphics2D g2 = (Graphics2D)this.getGraphics() ; が悪い これが理解できるようになると 描画の仕組みが分かるかもしれないわ
- askaaska
- ベストアンサー率35% (1455/4149)
んー ここは教えてあげないと厳しいかしらね 次のメソッドを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というメソッドのオーバーライドが何を意味するか理解できると どんどん作れるようになるかも?
お礼
色々試してみましたが、どうしてもうまく表示されません。 //=========================================================== 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)
と思ったけどよく見ると明らかね 悪いのはここ Graphics2D g2 = (Graphics2D) this.getGraphics(); thisは現在初期化中(コンストラクタ中)なので まだ描画されていないから Graphicsオブジェクトは取れないわ nullが返るのよ Graphics2D g2 = (Graphics2D)this.getGraphics() ; 以降を別のメソッドに記述して 最低でも描画処理対象になる this.add( dp ) ; か this.setVisible( true ) ; より後ろで実行しないとダメよ どっちが正解かは試してみて
お礼
回答有り難うございます。 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)
drawLine.java の 46行目はどの処理かしら?
- Picosoft
- ベストアンサー率70% (274/391)
それはエラーの「場所」ですよね……。 こんな形ででてきませんか? Exception in thread "~" java.~Exception:(説明) at …… at …… > 単純なエラーだろうと思い、分かる人が見ればすぐに発見できるだろうと思ってしまいました。 内容によってはすぐに発見できることもありますが、 ソースを隅から隅まで確認するのが正直めんどくさいので(私だけかもしれませんが) 出せる情報は小出しにせず全部出していただけると回答しやすいです。
お礼
すみません、一番上の行のエラーコメントがコピペ出来ていませんでした。 出し惜しみではないです。 宜しくお願いします。 =========================================================== 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)
本当にそれだけしか表示されないのですか? その前に何かありませんか?
- askaaska
- ベストアンサー率35% (1455/4149)
そのエラーの内容を書いてほしいわ あなたが理解できなくても 私が理解できなくても 誰かが理解できるかもしれないもの
お礼
すみません、エラーの内容を張ります。 単純なエラーだろうと思い、分かる人が見ればすぐに発見できるだろうと思ってしまいました。 ======================================================== 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) ========================================================
お礼
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 ) ; } } } ================================================================