プロが教える店舗&オフィスのセキュリティ対策術

 アップレットにアクションリスナーをつけて、アップレットとキャンバスにアクションが来るように
下の様なコードを書いてやりましたがうまく動作しません。どこがまずいのでしょうか、宜しくお願
いします。

 ・mouseClickedするとアプレットに四角を書くようにしていますが、最初に表示されてしまいます。
 ・mouseEnteredするとキャンバスに四角を書くようにしていますが、最初には表示されず、
mouseEnteredでも四角を書きません。
 ・"cs.paint(g);"での書き方が悪いのでしょうか。「gを解決できません」と表示されます。
  "paint(g);"としても同じです、"mouseClicked"の中でも同じ書き方ですが、
  「gを解決できません」というエラー表示は出ていません。

 原因が全く分かりません、どこをどのように修正したら良いのでしょうか、宜しくお願い致します。

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

import java.applet.Applet;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;

public class ActionTest extends Applet implements MouseListener
{
Canvas cs ;

public void init()
{
this.setBackground(Color.pink);
Canvas cs = new Canvas( ) ;
cs.setBackground(Color.green);
cs.setSize( 100 , 100 ) ;
this.add( cs ) ;

this.addMouseListener( this ) ;
}

public void paint(Graphics g)
{
g.fillRect( 50 , 50 , 10 , 10 ) ;
}

public void mouseClicked(MouseEvent e)
{
Graphics g = getGraphics() ;
setBackground( Color.cyan ) ;
paint(g) ;
repaint();
}

public void mouseEntered(MouseEvent e)
{
cs.setBackground( Color.orange ) ;
cs.paint(g) ;
repaint();
}

public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }
}

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

A 回答 (7件)

●mouseClickedの件


paintメソッドの動作について、誤解があるのでは?
このメソッドは、repaintメソッドを呼ばれたときだけ動作するのではありません。
例えば,ウインドウの最小化から戻したときやウインドウのサイズを変えたときなど、
頻繁に呼ばれます。
そして当然のように、プログラムを起動しウインドウが表示されたときにも呼ばれます。

このコードでは、paintメソッドで単に矩形を描画しているだけですので、
アプレット開始時に表示されます。

マウスのクリック後に表示したいのであれば、制御する仕組みを加える必要があります。

例えば、

1.インスタンス変数で、制御用の変数を定義する。
 この変数は初期状態でfalseにしておく。
2.paintメソッドでは、制御用変数がtrueのときのみ描画する
3.マウスクリックで制御用変数をtrueにする。

とすればいいかと思います。


●mouseEnteredの件
Canvasのpaintメソッドに何も定義されていないため、何も描画されません。


●「gを解決できません」の件
mouseEnteredメソッドの中で、gを宣言していません。
mouseClickedメソッドと同じようにgを宣言してください。


以上
    • good
    • 0
この回答へのお礼

ngsvxさん、回答有り難うございます。

 paintは、mouseClickedの中に書いていましたので、そこからしか呼ばれないのかと思っていました。

 下のように、キャンバスを別クラスで書き直しましたが、今度はキャンバスが見えません。
 何故でしょうか。

================================================================
public class ActionTest extends Applet implements MouseListener
{
Canvas cs ;
boolean flag = false ;
Graphics g ;

public void init()
{
this.setBackground(Color.pink);
this.addMouseListener( this ) ;
myCanvas mc = new myCanvas( ) ;
this.add( mc ) ;
}

public void paint(Graphics g)
{
if( flag == true )
{
g.fillRect( 50 , 50 , 10 , 10 ) ;
}
}

public void mouseClicked(MouseEvent e)
{
Graphics g = getGraphics() ;
setBackground( Color.cyan ) ;
flag = true ;
repaint();
}

public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }

class myCanvas extends Canvas implements MouseListener
{
public void init()
{
setBackground(Color.green) ;
setSize( 100 , 100 ) ;
}

public void mouseEntered(MouseEvent e)
{
setBackground( Color.orange ) ;
repaint();
}

public void mouseClicked(MouseEvent e) { }
public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }
}
}

お礼日時:2012/10/29 11:17

>下のように、キャンバスを別クラスで書き直しましたが、今度はキャンバスが見えません。



キャンバス自体が見えないのでしょうか?
それともキャンバスで描画されるはずの図形が見えないのでしょうか?

アプレットの中に緑の矩形があれば、そこがキャンバスです。

キャンバスの中の図形が見えないということなら、当然です。

キャンバスに何も描画していないのですから。

描画するのであれば、キャンバスのpaintメソッドをオーバーライドし、
描画に必要なコードを記述してください。
    • good
    • 0
この回答へのお礼

 回答有り難うございます。
 
 緑の矩形も見えませんし、キャンバスに円を書いてやりましたが、それも見えません。
 宜しくお願いします。

==================================================================
public class ActionTest extends Applet implements MouseListener
{
Canvas cs ;
boolean flag = false ;
Graphics g ;

public void init()
{
this.setBackground(Color.pink);
this.addMouseListener( this ) ;
myCanvas mc = new myCanvas( ) ;
this.add( mc ) ;
}

public void paint(Graphics g)
{
if( flag == true )
{
g.fillRect( 50 , 50 , 10 , 10 ) ;
}
}

public void mouseClicked(MouseEvent e)
{
Graphics g = getGraphics() ;
setBackground( Color.cyan ) ;
flag = true ;
repaint();
}

public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }

class myCanvas extends Canvas implements MouseListener
{
public void init()
{
setBackground(Color.green) ;
setSize( 100 , 100 ) ;
}

public void paint(Graphics g)
{
g.setColor(Color.black) ;
g.drawOval(10,10,20,20);
}

public void mouseEntered(MouseEvent e)
{
setBackground( Color.orange ) ;
repaint();
}

public void mouseClicked(MouseEvent e) { }
public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }
}
}

お礼日時:2012/10/29 13:12

先ほどは、ちょっと見間違いをしていました。




「緑の矩形」というのは表示されないはずです。

キャンバスのサブクラスのinitメソッドは実行されませんので、
緑の矩形は表示されません。
initメソッドは、アプレットにおいて実行されるメソッドです。
キャンバスはアプレットではないので実行されません。
キャンバスのinitメソッドをコンストラクタに変更してください。

それでどのように表示されるか教えてください。
    • good
    • 0
この回答へのお礼

 回答有難うございます。

 Canvasはうまく表示されましたが、Canvasに"mouseEntered"のリスナを付けているのですが
うまく実行出来ません。
 
 何かが未だ間違っているのでしょうか。
 
 宜しくお願いします。
 

お礼日時:2012/10/30 01:18

>Canvasはうまく表示されましたが、Canvasに"mouseEntered"のリスナを付けているのですが


うまく実行出来ません。

リスナーはあっても、それを登録していないからです。
あえて正解は書きませんので、確認してみてください。

考えてみてもわからなければ回答します。
    • good
    • 0
この回答へのお礼

ngsvxさん、何度も回答ありがとう御座います。

 やっと正常に動きました。
 これ(Canvasの動き)をAppletのクリックとかでCavasの色を変えたりすることは出来るので
しょうか。
 宜しくお願いします。

お礼日時:2012/10/30 12:35

>これ(Canvasの動き)をAppletのクリックとかでCavasの色を変えたりすることは出来るのでしょうか。



「(Canvasの動き)」というのがどのような意味なのかわかりませんが、
クリックとかでCavasの色を変えるのはそれほど難しくはありません。

今のコードは表示色をコードで固定しているので、これを変数にして、
マウスのクリック時にこの変数を表示したい色に設定すればいいわけです。
なお、この変数はpaintメソッドやマウスイベントのメソッドなどで使うため、
インスタンス変数とする必要があります。
    • good
    • 0
この回答へのお礼

ngsvxさん、お礼が遅くなりましたが、下のように書いてみました。

 ngsvxさんの内容を色々と参考書で調べながら何度も書き直しましたが、
「this.addMouseListener(mc) ;」のところで、「このメッソドは適用
出来ません」みたいなエラーがでます。
 
 どのように修正してやればよいのでしょうか。

 宜しくお願いします。

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

public class ActionTest3 extends Applet implements MouseListener
{
Canvas cs ;
boolean flag = false ;
Graphics g ;
myCanvas mc;


public void init()
{
this.setBackground(Color.pink);
this.addMouseListener( this ) ;

myCanvas mc = new myCanvas( this ) ;
this.addMouseListener(mc) ;
this.add( mc ) ;
}

public void paint(Graphics g)
{
if( flag == true )
{
g.fillRect( 50 , 50 , 10 , 10 ) ;
}
}

public void mouseClicked(MouseEvent e)
{
Graphics g = getGraphics() ;
setBackground( Color.cyan ) ;
flag = true ;
repaint();
}

public void mouseEntered(MouseEvent e)
{
Graphics g = getGraphics() ;
mc.setBackground( Color.orange ) ;
repaint();
}

public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }

class myCanvas extends Canvas /*implements MouseListener*/
{
ActionTest3 at3;

public myCanvas(ActionTest3 at3)
{
this.at3 = at3 ;
setBackground(Color.green) ;
setSize( 100 , 100 ) ;
}

public void paint(Graphics g)
{
g.setColor(Color.black) ;
g.drawOval(10,10,20,20);
}
}
}

お礼日時:2012/11/02 08:44

>「this.addMouseListener(mc) ;」のところで、「このメッソドは適用出来ません」みたいなエラーがでます。



myCanvas の定義で「implements MouseListener」がコメントになっていますね。
これが直接の原因です。

MouseListenerを実装していないものをMouseListenerとして登録しようとしても登録できません。

「myCanvas mc = new myCanvas( this ) ;」をコメント化して、mouseClickedメソッドで
呼び出し元を判定しながら処理を分けるという方法もありますが、お勧めしません。


ところで、このような質問が出るというのは、次の2つが考えられるのですが、どちらでしょうか?

a.単にそそっかしくて、見落とした。
b.インターフェースについての理解が低い。

aは何度も確認し気をつけたり、経験を積んで補うしかないかもしれません。

bは関係箇所について再度学習する必要がありあそうです。
    • good
    • 0
この回答へのお礼

回答有難う御座います。

>myCanvas の定義で「implements MouseListener」がコメントになっていますね。
>これが直接の原因です。
>MouseListenerを実装していないものをMouseListenerとして登録しようとしても登録できません。

# myCanvas の定義で「implements MouseListener」のコメントを外すと、「インターフェイスのメソッドを
 実装してください」とのエラーが出ます。

  実装してやると「インターフェイスのメソッドが重複しています」とのエラーが出ます。
 (親クラスと子クラスに同じメソッドがあるからでしょうか?)

  この内容は、AppletとCanvasの両方にMouseListenerをつけているのですが、
  初心者には全く原因がわかりません。宜しくお願いします。
 


>「myCanvas mc = new myCanvas( this ) ;」をコメント化して、mouseClickedメソッドで
>呼び出し元を判定しながら処理を分けるという方法もありますが、お勧めしません。


# このような書き方は、具体的にはどのように書くのでしょうか。
  また、プログラムの書き方としては良くないというのはどのような理由なのでしょうか。
  参考までに是非ご教示お願い致します。

今後もっとjavaを本格的に勉強したいです、宜しくお願いします。

お礼日時:2012/11/02 12:03

>実装してやると「インターフェイスのメソッドが重複しています」とのエラーが出ます。



#5のお礼に記述されたコードに実装してもそのようなメッセージは出ないと思います。
すでにこのコードとはかなり違うものになっていませんか?
違うコードになっていると、こちらからは適切なアドバイスはできません。

#2のお礼にあるコードに#3の回答を修正したものが、#4でうまくいっているようなので、
そこから、やり直したほうが早いかもしれません。



># このような書き方は、具体的にはどのように書くのでしょうか。
 また、プログラムの書き方としては良くないというのはどのような理由なのでしょうか。

これはケースバイケースなのですが、今回はやめたほうがいいと思います。
この方法では、Canvasで発生したイベントを、Appletで処理することになります。
すると、CanvasとAppletの関係が密となり、切り離せない関係となります。
そうすると、プログラムの変更/修正などがしにくいプログラムとなってしまうのが理由です。
クラスはなるべく関係性を疎にしておいたほうが応用が利きやすいのです。

最初の方法、つまりCanvasで発生したイベントをCanvasで処理するということは、
処理がCanvasで完結し、Canvasの独立性が保たれます。


さて、具体的な方法ですが、

イベントのリスナーに定義されるメソッドの引数は、EventObjectを継承したものですので、getSource()というメソッドで、イベントを発生させたオブジェクトを取得できます。

これを使って、処理を振り分けます。
public void mouseClicked(MouseEvent e)

{
 Object sourceObject = e.getSource();
 if( sourceObject == canvasObject ){
  //Canvas用の処理

 }
 if( sourceObject == appletObject ){
  //Applet用の処理

 }

}

なお、「canvasObject 」「appletObject 」は、インスタンス変数としておくことが必要です。
    • good
    • 0
この回答へのお礼

 回答有難う御座います。
 何とかうまく動くようになりました。

 インスタンス変数を作ってイベントの振分けの方法も勉強しているのですが、その方法が分かりません。
 
 下のように書いてやりましたが、うまく実行できません。
 宜しくお願いします。
 
===================================================================

public class ActionTest6 extends Applet implements MouseListener
{
Canvas cs ;
boolean flag = false ;
Graphics g ;
myCanvas mc ;
boolean flag2 = false ;

public void init()
{
this.setBackground(Color.pink);
this.addMouseListener( this ) ;

myCanvas mc = new myCanvas( this , flag2) ;
this.addMouseListener( mc ) ;
this.add( mc ) ;
}

public void paint( Graphics g )
{
if( flag == true )
{
g.fillRect( 50 , 50 , 10 , 10 ) ;
}
}

public void mouseClicked( MouseEvent e )
{
Graphics g = getGraphics() ;
setBackground( Color.cyan ) ;
flag = true ;
repaint();
}

public void mouseEntered( MouseEvent e )
{
Object sourceObject = e.getSource();
if( sourceObject == mc )
{
flag2 = true ;
}
}

public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }

class myCanvas extends Canvas implements MouseListener
{
ActionTest6 a ;
boolean fc = false ;

public myCanvas( ActionTest6 a , boolean f)
{
this.a = a ;
this.fc = f ;
setBackground( Color.green ) ;
setSize( 100 , 100 ) ;
addMouseListener( this ) ;
}

public void paint( Graphics g )
{
g.setColor( Color.black ) ;
g.drawOval( 10 , 10 , 20 , 20 ) ;
if(fc == true)
{
mc.setBackground( Color.black ) ;
repaint() ;
}
}

public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e) { }
public void mouseExited(MouseEvent arg0) { }
public void mousePressed(MouseEvent arg0) { }
public void mouseReleased(MouseEvent arg0) { }
}

}

お礼日時:2012/11/03 10:45

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