java歴3ヶ月の初心者です。よろしくお願いします。

現在、Swingを用いたパズルを作成しているのですが、
パネル上にあるラベルをクリックすると、
ラベルを乗っけていたパネル全体がラベルとなるようにゲーム画面を作りたいのですが、
「クリックにより、GUI部品をはずし別の部品をつける」
という方法がわかりません。
できればクリックするごとに元の状態と交互に表示できるようにしたいです。

試した方法としてはmouseClicked内にremove()やsetVisible(boolean)
で消したのですが、その後にラベルを加えることができませんでした。

ご回答よろしくお願いいたします。

A 回答 (3件)

>「視覚上のコンポーネントの数とgetComponentの数が違う時はどのような原因が考えうるか」



とりあえず、Component#list(System.out)を使用して
コンポーネントのリストを出力し、ボタンを押す前と後で
どこが違うか調べてみたらどうでしょうか。
    • good
    • 0
この回答へのお礼

オブジェクトの状態から、他のメソッドからそのオブジェクトをいじっていたことがわかりました。
ありがとうございました。

お礼日時:2002/01/29 15:30

>デバッグをして症状をみたところremoveをした瞬間にはオブジェクト自体は


>取り除かれている
>けれども、視覚上は消えていないらしいことがわかりました。

とりあえず、removeを行った後にrepaintしてみたらどうでしょうか?

この回答への補足

ご指摘を基に更に色々調べてみたところ
repaint、revalidateが有効であるらしい、というところまでいきました。ありがとうございます。
それにより大体の症状は改善されたのですがまだいくつかのエラーが残ったので
アドバイスお願いいたします。

作成しているのはパズルの自動解答&作成ソフト(ナンバープレイス)です。
数値を入れ、自動解答ボタンにより答えを求めた後に複数のラベルを持つパネルを
ダブルクリックすると大きなラベルにならずにダブルクリックしたラベルだけが消えてしまいます。
自動解答ボタンのイベントを行う前は、複数のラベルを持つパネルをダブルクリックすると大きな
一つのラベルになっていたのにプログラム上の別のイベントを起こした後になると
できないという症状です。
 自分なりにデバッグをしてみたところ、視覚上は1つのラベルなのにgetComponentCount
をしてみると9と返されたりします。また、removeAllでパネル上全てのオブジェクトをはずし
1枚の大きなラベルをaddするとgetComponentCountは1になるのですが視覚上はremoveAllさ
れただけの状態でラベルが表示されていません。
今までrepaint、revalidateで更新ができるできるようになった物はrepaint等ない時でもウィンドウ
のサイズをマウスで変えたりすると更新されていましたが、今回のエラーではサイズを変えても
更新されません。

うまく説明できず、この説明ではわかりずらいと思われるので、核の部分だけに絞って質問させて
いただきますと、
「視覚上のコンポーネントの数とgetComponentの数が違う時はどのような原因が考えうるか」
です。わかりにくくて申し訳ありませんがよろしくお願いいたします。

(ソースが込み入ってしまっている上、どこが原因かわからず、GUIを生成しているクラスが300行近い
のでソースを示すのは避けます。)

補足日時:2002/01/24 22:37
    • good
    • 0

InUteroさんが書かれているように、mouseClicked()で、表示を消すクラスをremove()し、


表示するクラスをadd()する方法が一番よいと思います。
しかし、この処理をするときにはいろいろと気を配ることがあります。
ます、コントロールを乗せるPanelなどのクラスのレイアウトがどうなっているかです。
borderLayoutなどではadd()やremove()を実行するたびにレイアウト表示が変わりますので、
レイアウトをnullに設定して、自分でsetLocation()やsetSize()などを使い、
固定しておくのも一つの方法です。

とにもかくにも、場合場合によっていろいろと落とし穴がありますので、
こういう場合は、まずは失敗したプログラムを載せてもらえると
回答がしやすいです。

この回答への補足

Tanaka Shinyaさんご回答ありがとうございます。
アドバイスに注意しながら試してみたところPanelを消した後に同じ場所に
ラベルを張ることができました。
しかし、しばらく実装を進めたところまたこのイベントで不明な点が出てきた
為、お手数ですが可能でしたらご回答お願いします。

私の作成したいプログラムは
・ダブルクリックした文字をそのパネル全体にjpn(JLabel)
 として表示する
・右クリックでsel(JLabel)に右と表示
・左クリックでselに左と表示する
です。

 アドバイスにより近い物ができたのですが「落とし穴」にはまっているようで、
ダブルクリックしてもその時はパネルが消えず、同様のイベント処理を準備してある
別のパネルをクリック(もしくは右,ダブルクリック)
をした瞬間になるとさっき消えるはずであったパネルが消えます。
つまりイベントの起こるタイミングがずれている状態です。

 デバッグをして症状をみたところremoveをした瞬間にはオブジェクト自体は取り除かれている
けれども、視覚上は消えていないらしいことがわかりました。
それ以上の原因は私の力では調べられませんでした。

長くなってしまいましたがご指摘通りソースを文末に載せたのでご回答していただければ幸いです。
よろしくお願いいたします。
 

public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
 inta=0,b=0;
A:
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if((JLabel)e.getSource()==sel[i][j]){
   block[i][j].remove(selPanel[i][j]);
block[a/9][b/9].setVisible(true);
break A;
}
JLabel jpn=new JLabel("D");
block[a/9][b/9].add(jpn);
jpn.setVisible(true);
}
 else if(e.getModifiers()==e.BUTTON1_MASK)
 ((JLabel)e.getSource()).setText("左");
else if(e.getModifiers()==e.BUTTON3_MASK){
L:
 for(int a=0;a<27;a++)
 for(int b=0;b<27;b++)
if((JLabel)e.getSource()==sel[a][b]){
((JLabel)e.getSource()).setText("右");
break L;
}
}
}

補足日時:2002/01/17 08:20
    • good
    • 0
この回答へのお礼

コンポーネントの描画について参考になりました。
ありがとうございました。

お礼日時:2002/01/29 15:32

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

今、見られている記事はコレ!

  • 好きだけどケンカばかり……そんな彼との結婚は?

    やたらとケンカが多いカップルというのはいる。それでも腐れ縁なのか長く交際し、いざ結婚しようと決めたときに、ふと思い悩む。こんなにケンカが多いのに、結婚して大丈夫? と。今回は「教えて!goo」に寄せられ...

  • ポンコツな日々:第125話「食べてもOK」

    日々のちょっとしたヘンな出来事を、1話完結形式の4コマで綴っていきます。時にするどく、時にやんわり、ありそうで無さそうな日常の1コマを切り取ってお届けします。

  • “罵声大会”に怒り心頭?名指しで苦情も……駅員泣かせの鉄道ファン

    時として人は趣味に没頭してしまうと、周囲に迷惑をかけてしまいがち。それが公共の場ならばなおさらである。「教えて!goo」に「何で鉄道ファンはマナーの悪い人が多いのでしょうか?」との質問を見つけた。鉄道愛...

  • たまランチ:第102話「ネコ好き」

    外ランチを愛してやまない元気な女子社員・たまちゃん(26)。オシャレなお店より「安くておいしい」お店が大好き! そんな女子力低めなたまちゃんの、色気より食い気な日々をつづります。

  • エルフ田さん:第125話「洗濯干しの『コツ』」

    エルフ(ファンタジーとかに出てくる長寿の種族)の「エルフ田」と、ただの人間である女子社員2人による日常ギャグ。エルフならではのズレたツッコミでバシバシ人間界の話題を斬っていきます。

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ