アップレットにアクションリスナーをつけて、アップレットとキャンバスにアクションが来るように
下の様なコードを書いてやりましたがうまく動作しません。どこがまずいのでしょうか、宜しくお願
いします。
・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) { }
}
==================================================================
No.1
- 回答日時:
●mouseClickedの件
paintメソッドの動作について、誤解があるのでは?
このメソッドは、repaintメソッドを呼ばれたときだけ動作するのではありません。
例えば,ウインドウの最小化から戻したときやウインドウのサイズを変えたときなど、
頻繁に呼ばれます。
そして当然のように、プログラムを起動しウインドウが表示されたときにも呼ばれます。
このコードでは、paintメソッドで単に矩形を描画しているだけですので、
アプレット開始時に表示されます。
マウスのクリック後に表示したいのであれば、制御する仕組みを加える必要があります。
例えば、
1.インスタンス変数で、制御用の変数を定義する。
この変数は初期状態でfalseにしておく。
2.paintメソッドでは、制御用変数がtrueのときのみ描画する
3.マウスクリックで制御用変数をtrueにする。
とすればいいかと思います。
●mouseEnteredの件
Canvasのpaintメソッドに何も定義されていないため、何も描画されません。
●「gを解決できません」の件
mouseEnteredメソッドの中で、gを宣言していません。
mouseClickedメソッドと同じようにgを宣言してください。
以上
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) { }
}
}
No.2
- 回答日時:
>下のように、キャンバスを別クラスで書き直しましたが、今度はキャンバスが見えません。
キャンバス自体が見えないのでしょうか?
それともキャンバスで描画されるはずの図形が見えないのでしょうか?
アプレットの中に緑の矩形があれば、そこがキャンバスです。
キャンバスの中の図形が見えないということなら、当然です。
キャンバスに何も描画していないのですから。
描画するのであれば、キャンバスのpaintメソッドをオーバーライドし、
描画に必要なコードを記述してください。
回答有り難うございます。
緑の矩形も見えませんし、キャンバスに円を書いてやりましたが、それも見えません。
宜しくお願いします。
==================================================================
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) { }
}
}
No.3
- 回答日時:
先ほどは、ちょっと見間違いをしていました。
「緑の矩形」というのは表示されないはずです。
キャンバスのサブクラスのinitメソッドは実行されませんので、
緑の矩形は表示されません。
initメソッドは、アプレットにおいて実行されるメソッドです。
キャンバスはアプレットではないので実行されません。
キャンバスのinitメソッドをコンストラクタに変更してください。
それでどのように表示されるか教えてください。
回答有難うございます。
Canvasはうまく表示されましたが、Canvasに"mouseEntered"のリスナを付けているのですが
うまく実行出来ません。
何かが未だ間違っているのでしょうか。
宜しくお願いします。
No.4
- 回答日時:
>Canvasはうまく表示されましたが、Canvasに"mouseEntered"のリスナを付けているのですが
うまく実行出来ません。
リスナーはあっても、それを登録していないからです。
あえて正解は書きませんので、確認してみてください。
考えてみてもわからなければ回答します。
ngsvxさん、何度も回答ありがとう御座います。
やっと正常に動きました。
これ(Canvasの動き)をAppletのクリックとかでCavasの色を変えたりすることは出来るので
しょうか。
宜しくお願いします。
No.5
- 回答日時:
>これ(Canvasの動き)をAppletのクリックとかでCavasの色を変えたりすることは出来るのでしょうか。
「(Canvasの動き)」というのがどのような意味なのかわかりませんが、
クリックとかでCavasの色を変えるのはそれほど難しくはありません。
今のコードは表示色をコードで固定しているので、これを変数にして、
マウスのクリック時にこの変数を表示したい色に設定すればいいわけです。
なお、この変数はpaintメソッドやマウスイベントのメソッドなどで使うため、
インスタンス変数とする必要があります。
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);
}
}
}
No.6
- 回答日時:
>「this.addMouseListener(mc) ;」のところで、「このメッソドは適用出来ません」みたいなエラーがでます。
myCanvas の定義で「implements MouseListener」がコメントになっていますね。
これが直接の原因です。
MouseListenerを実装していないものをMouseListenerとして登録しようとしても登録できません。
「myCanvas mc = new myCanvas( this ) ;」をコメント化して、mouseClickedメソッドで
呼び出し元を判定しながら処理を分けるという方法もありますが、お勧めしません。
ところで、このような質問が出るというのは、次の2つが考えられるのですが、どちらでしょうか?
a.単にそそっかしくて、見落とした。
b.インターフェースについての理解が低い。
aは何度も確認し気をつけたり、経験を積んで補うしかないかもしれません。
bは関係箇所について再度学習する必要がありあそうです。
回答有難う御座います。
>myCanvas の定義で「implements MouseListener」がコメントになっていますね。
>これが直接の原因です。
>MouseListenerを実装していないものをMouseListenerとして登録しようとしても登録できません。
# myCanvas の定義で「implements MouseListener」のコメントを外すと、「インターフェイスのメソッドを
実装してください」とのエラーが出ます。
実装してやると「インターフェイスのメソッドが重複しています」とのエラーが出ます。
(親クラスと子クラスに同じメソッドがあるからでしょうか?)
この内容は、AppletとCanvasの両方にMouseListenerをつけているのですが、
初心者には全く原因がわかりません。宜しくお願いします。
>「myCanvas mc = new myCanvas( this ) ;」をコメント化して、mouseClickedメソッドで
>呼び出し元を判定しながら処理を分けるという方法もありますが、お勧めしません。
# このような書き方は、具体的にはどのように書くのでしょうか。
また、プログラムの書き方としては良くないというのはどのような理由なのでしょうか。
参考までに是非ご教示お願い致します。
今後もっとjavaを本格的に勉強したいです、宜しくお願いします。
No.7ベストアンサー
- 回答日時:
>実装してやると「インターフェイスのメソッドが重複しています」とのエラーが出ます。
#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 」は、インスタンス変数としておくことが必要です。
回答有難う御座います。
何とかうまく動くようになりました。
インスタンス変数を作ってイベントの振分けの方法も勉強しているのですが、その方法が分かりません。
下のように書いてやりましたが、うまく実行できません。
宜しくお願いします。
===================================================================
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) { }
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java java final 1 2022/06/10 22:49
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java eclipse実行ができない 2 2022/07/27 04:47
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自分の描いた絵をシールにした...
-
210、220クラウンのターボとH...
-
ラパンの歴代の色を知りたいです!
-
白いキャディバッグの黄ばみを...
-
jpgファイルを3枚つなげる
-
土屋圭市のスイフトスポーツで...
-
クラウン伝統のペリメーターフ...
-
ムーブキャンバスとハスラーど...
-
ラパン軽自動車は、何キロまで...
-
レクサスのクルーズコントロー...
-
クラウンは昔よりコストダウン...
-
Wordのグループ化したオブジェ...
-
新型プリウスって高級車ですか?
-
カンヴァス?
-
皆さんは大きな公募展に出展搬...
-
布に、にじまないペンキは?
-
駐車場でハイルーフ車は止めら...
-
スズキアルトのドアー内張りの...
-
ソアラオーナーズクラブについて
-
新型クラウン、正面から見ると...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自分の描いた絵をシールにした...
-
ラパンの歴代の色を知りたいです!
-
210、220クラウンのターボとH...
-
Wordのグループ化したオブジェ...
-
トヨタ スマートキーの解錠時の...
-
白いキャディバッグの黄ばみを...
-
jpgファイルを3枚つなげる
-
2024年、2025年にフルモデルチ...
-
レクサスのクルーズコントロー...
-
スズキのハスラーに乗ってるの...
-
男でラパンに乗ってる人って何...
-
描画キャンパスへの貼り付け
-
トヨタのスマートキーは自動ロ...
-
デスクトップに画像を置く方法
-
プリウス乗ってる人のイメージ ...
-
レクサスに乗っていてオートバ...
-
WORD2002で表の中の文章を段組...
-
ラパン軽自動車は、何キロまで...
-
ワードで描画キャンパスの下線...
-
FRのクラウンについて 雪が多く...
おすすめ情報