重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

 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 ) ;
}
}

==============================================================================

A 回答 (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オブジェクトを
渡してくれます。
    • good
    • 0
この回答へのお礼

 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 ) ;
}
}
}

================================================================

お礼日時:2013/05/17 21:06

Graphics2D g2 = (Graphics2D)this.getGraphics() ;



が悪い

これが理解できるようになると
描画の仕組みが分かるかもしれないわ
    • good
    • 0

んー ここは教えてあげないと厳しいかしらね


次のメソッドを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というメソッドのオーバーライドが何を意味するか理解できると
どんどん作れるようになるかも?
    • good
    • 0
この回答へのお礼

色々試してみましたが、どうしてもうまく表示されません。

//===========================================================

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 ) ;
}
}

//=====================================================================

お礼日時:2013/05/14 23:47

と思ったけどよく見ると明らかね


悪いのはここ

Graphics2D g2 = (Graphics2D) this.getGraphics();

thisは現在初期化中(コンストラクタ中)なので
まだ描画されていないから
Graphicsオブジェクトは取れないわ
nullが返るのよ

Graphics2D g2 = (Graphics2D)this.getGraphics() ;
以降を別のメソッドに記述して
最低でも描画処理対象になる
this.add( dp ) ;

this.setVisible( true ) ;
より後ろで実行しないとダメよ

どっちが正解かは試してみて
    • good
    • 0
この回答へのお礼

回答有り難うございます。

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 ) ;
}
}

===========================================================================

お礼日時:2013/05/14 16:03

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

    • good
    • 0

それはエラーの「場所」ですよね……。


こんな形ででてきませんか?
 Exception in thread "~" java.~Exception:(説明)
  at ……
  at ……


> 単純なエラーだろうと思い、分かる人が見ればすぐに発見できるだろうと思ってしまいました。
内容によってはすぐに発見できることもありますが、
ソースを隅から隅まで確認するのが正直めんどくさいので(私だけかもしれませんが)
出せる情報は小出しにせず全部出していただけると回答しやすいです。
    • good
    • 0
この回答へのお礼

すみません、一番上の行のエラーコメントがコピペ出来ていませんでした。
出し惜しみではないです。
宜しくお願いします。

===========================================================

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)

===========================================================

お礼日時:2013/05/14 15:03

本当にそれだけしか表示されないのですか?



その前に何かありませんか?
    • good
    • 0

そのエラーの内容を書いてほしいわ



あなたが理解できなくても
私が理解できなくても
誰かが理解できるかもしれないもの
    • good
    • 0
この回答へのお礼

 すみません、エラーの内容を張ります。
 単純なエラーだろうと思い、分かる人が見ればすぐに発見できるだろうと思ってしまいました。

 ========================================================

 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)

 ========================================================

お礼日時:2013/05/14 13:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!