- PR -

メソッドが複数回呼ばれてしまいます。

1
投稿者投稿内容
macha
会議室デビュー日: 2008/05/22
投稿数: 8
投稿日時: 2008-06-30 14:42
カラーチューザーのカスタマイズ(パネルの削除・追加)をするプログラムを作成しています。パネルの上には1枚テーブルをのせます。
今回3枚のパネルを追加しようと思うのですが、パネルの追加に使うメソッドbuildChooser()が、すでに追加されたパネルでも呼び出されてしまうらしく、3枚のパネルを追加すると、1枚目に追加したパネルには3枚のテーブル、2枚目のパネルには2枚のテーブル、3枚目には1枚のテーブルがのってしまいます。
パネルを1枚だけ追加するのであればちゃんと1つテーブルが乗るのですが、2枚以上追加しようとすると上記のような状態になります。

このような状況をどうすればよいでしょうか?
スーパークラスのメソッド(?)の扱い方がよく分かりません。

何方かご教授ください。よろしくお願い致します。


ソースの一部
************************************************************************

jcc = new JColorChooser();

jcc.addChooserPanel(new ColorChooserCustom1());
jcc.addChooserPanel(new ColorChooserCustom2());
jcc.addChooserPanel(new ColorChooserCustom3());

     ↑ここで呼び出されるColorChooserustom*()で、パネルの追加を行う


***ColorChooserCustom*.java***
public class ColorChooserCustom2 extends AbstractColorChooserPanel implements MouseListener{

ColorTable2 table2;
Color color2;

protected void buildChooser(){
     table2 = new ColorTable2(); ←テーブルの追加
add(table2);
table2.addMouseListener(this);
}

↑このメソッドbuildChooser()が複数回呼ばれてるのではないかと思います


分かりにくくて申し訳ないのですが、

jcc.addChooserPanel(new ColorChooserCustom1()); で1枚目のパネルの追加
ColorChooserCustom1()のbuidChooser()でテーブルを乗せる

jcc.addChooserPanel(new ColorChooserCustom2()); で2枚目パネルの追加
ColorChooserCustom2()のbuidChooser()でテーブルを乗せる
このときにColorChooserCustom1()のbuidChooser()も呼び出されてしまっているのではないでしょうか・・・?




スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-06-30 15:19
JColorChooseを使ったことないし全体のコードもないので、どこが問題なのかは私にはわかりません。自分がこの状況に陥ったとしたら、デバッガでColorChooserCustom1のbuildChoose()にブレイクポイントをしかけて、2度目に来たときにどういう経路で来たか調べます。


[ メッセージ編集済み 編集者: スフレ 編集日時 2008-06-30 15:21 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-06-30 17:14
スフレさんの後付けになりますが、
new Throwable().printStackTrace();
を2回呼ばれているところに埋め込むと、
呼び出し元が追えるかと思います。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-07-01 09:19
> スーパークラスのメソッド(?)の扱い方がよく分かりません。
どういう継承関係にあるの?
スーパークラスなんか廃して、単純に、独立のチューザパネルを3つ作れば、スーパークラスのフィールドであるpanelが複数のサブクラスで使い回されるドジも、消えてなくなるでしょう。

継承によるクラス階層なんて、まったく要らんと思うけど…。
macha
会議室デビュー日: 2008/05/22
投稿数: 8
投稿日時: 2008-07-01 12:14
皆様、ご回答どうもありがとうございました。

どうも見当違いの質問をしてしまっていたみたいで、先ほど正しく動作させることが出来ました。


本当にありがとうございました。

スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-07-01 12:19
どういう問題があってどうやって解決したんでしょうか?

macha
会議室デビュー日: 2008/05/22
投稿数: 8
投稿日時: 2008-07-01 14:28
AbstractColorChooserPanelクラスのbuildChooser()を、
ColorChooserCustom1.java,ColorChooserCustom2.java,ColorChooserCustom3.java
で3回呼び出して下記のようにテーブルを追加していたのですが、
呼び出されるたびに内容が上書きされるのではなく、追加されていたみたいで、そのため呼び出した回数分、余分なテーブルが作成されていました。

フラグを立てて、if文で条件分けしたら上手くいきました。

protected void buildChooser(){
table2 = new ColorTable2();
add(table2);
table2.addMouseListener(this);
}


ご回答ありがとうございました。
1

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