- PR -

クラスの二重呼び出しについて

投稿者投稿内容
会議室デビュー日: 2006/09/11
投稿数: 11
投稿日時: 2006-09-11 17:36
はじめまして。Javaでアプリケーションを作る際に行き詰ってしまい、投稿させていただきました。
ご指導いただければ幸いです。よろしくお願いいたします。

一ヶ月前よりドローイングソフトを作っているのですが、機能別にクラスを分け、ボタンを押すとそのクラスを呼び出す、という形で作りました。
自由曲線や短形、楕円などの機能をつけ、それぞれのクラスを呼び出すためのボタンをつけています。
ボタンを押し、最初に自由曲線クラスを呼び出し、次に短形を呼び出します。
その後で再度、自由曲線クラスを呼び出すと、このクラスが二重に動いていることが判りました。
一度目に呼び出したクラスを、別のクラスが呼び出されたときに終了させるには、どのような記述をすればいいのでしょうか?

クラスの呼び出し方は↓のようにしています。
class ActionAdapter implements ActionListener{
 public void actionPerformed(ActionEvent evt){
  if(evt.getSource() == btm[0]){
    bttool.tools(0);
    color[0] = color[1];
    dline.dl();  //dlineクラスのdlメソッドを呼び出しています。
  }
  if(evt.getSource() == btm[1]){
    bttool.tools(1);
    color[0] = color[2];
    dline.dl();
  }
  if(evt.getSource() == btm[2]){
    bttool.tools(2);
    frect.fr();
  }

  ・・・・
}




どうぞよろしくお願いします。
ひら
ぬし
会議室デビュー日: 2005/03/04
投稿数: 260
投稿日時: 2006-09-11 18:03
dlineが自由曲線クラスと考えてよろしいでしょうか?

ソースを全て見たわけではないので、推測でしかありませんが、
dlineクラスの生成を1回だけしか行っていないのではないでしょうか?

自由曲線呼び出しボタンがクリックされた際に新しいdlineを生成するのが
よいと思います。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-09-11 18:12
>二重に動いていること
というのがそもそもどういう状態なのか、分かりません…。
インスタンスが2つあるということなんでしょうか。

>次に短形を呼び出します。
矩形(くけい)ですか?
会議室デビュー日: 2006/09/11
投稿数: 11
投稿日時: 2006-09-11 19:57
ひら様
>dlineが自由曲線クラスと考えてよろしいでしょうか?
そうです。dlineを自由曲線クラスとして定義しています。
えっと、生成が一回だと、やはり呼び出す度に二重、三重となってしまうということでしょうか?

自由曲線クラスのソースは↓のように作りました。
public class DLine{
 Main dline;
 int oldx = -1, oldy = -1;
 int newx = -1, newy = -1;

 //------------------------------------------------------------------

 public DLine(Main dline){
  this.dline = dline;
 }

 //-----------------------------------------------------------

 public void dl(){
  dline.addMouseMotionListener(new MouseMotionAdapter() {
   public void mouseDragged(MouseEvent evt) {
     ・・・描画の処理・・・
   }
  });

  dline.addMouseListener(new MouseAdapter() {
   public void mousePressed(MouseEvent evt) {
     ・・・描画の処理・・・
   }

   public void mouseReleased(MouseEvent evt){
     ・・・描画の処理・・・
   }
  });
 }
}

自由曲線ボタンが押されたときに生成しようとして、ボタンを押したときの処理に
dline = new DLine();
と書いてコンパイルすると、 「DLineのDLine(Main)は()に適用できません」というエラーメッセージが表示されます。
ボタンをクリックしたときに生成するにはどのように記述すればいいのでしょうか?

-----------------------------------

mio様
>矩形ですか?
文字が間違ってました。矩形のことです。すみません。

>二重に動いていること
最初に呼び出した自由曲線クラスが終了せずに、再度呼び出すと、一回の動作で二回クラスが動いているような感じです。
例えば、一回の動作でcutというint型の変数に1加えるという操作を記述していると、本来なら、初期値を0に設定すれば一回の動作で1になるはずが、一回の動作で二回処理が行われています。
処理の最後にSystem.out.printlnでその様子を見てみると、
cnt=1
cnt=2
と表示されていました。
このことから、クラスが二重に動いているのではないかと疑っています。
ひら
ぬし
会議室デビュー日: 2005/03/04
投稿数: 260
投稿日時: 2006-09-11 21:04
引用:

凛さんの書き込み (2006-09-11 19:57) より:
えっと、生成が一回だと、やはり呼び出す度に二重、三重となってしまうということでしょうか?


自由曲線1つにつき1オブジェクトとなるのが自然と思います。
Mainクラスの正体は何でしょうか? Dlineクラスと型が合っていないため
エラーになっているものと思われます。
会議室デビュー日: 2006/09/11
投稿数: 11
投稿日時: 2006-09-11 21:13
引用:

ひらさんの書き込み (2006-09-11 21:04) より:
Mainクラスの正体は何でしょうか? Dlineクラスと型が合っていないため
エラーになっているものと思われます。



Mainクラスは実行するときの一番基になるクラスです。
public class Main extends JPanel{ ・・・・}としています。
全てのクラスはMainから呼び出すようにしています。
一番最初に、 DLine dline; と定義しておき、
public Main(){}の中で、 dline = new dline(this); としました。
そして、ボタンを押すと、dline.dl(); で呼び出します。
このようにすると、二重処理が起こってしまいます。

mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-09-11 21:51
リスナ登録が二回行われているようなことはないですか。
いろんな箇所にデバッグを挟んでみて、どこから先が二回動いているのかを、確かめてみては。

メソッドを呼び出すだけで、その中の処理が二回動くということは、そういう作り方を敢えてしない限りは、ないです。
dline = new dline(this);がどこで行われているにせよ、二つめが生成された時点で最初のものへの参照が失われる(はず)ので、そのメソッドを呼び出すこともできません。
だとしたら、メソッドの呼び出しそのものが二度行われているのではないかと…。
会議室デビュー日: 2006/09/11
投稿数: 11
投稿日時: 2006-09-11 22:00
デバッグを色々なところに挟んでやってみることにします。

引用:

メソッドを呼び出すだけで、その中の処理が二回動くということは、そういう作り方を敢えてしない限りは、ないです。
dline = new dline(this);がどこで行われているにせよ、二つめが生成された時点で最初のものへの参照が失われる(はず)ので、そのメソッドを呼び出すこともできません。
だとしたら、メソッドの呼び出しそのものが二度行われているのではないかと…。



メソッドの呼び出し(私の場合は、dline.dl();)が重複しているから、ということでしょうか?
生成は一度だけ行っており、あとは、ボタンを押すと呼び出しを行うというようにしています。ということは、ボタンを押すたびにdline.dl();が重複しているために起こっている、と考えればよいのでしょうか?
一回目に呼び出したdline.dl();をもう一度呼び出すのに、同じようにdline.dl();と記述するのでは駄目なのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)