オブジェクト生成についての疑問

このQ&Aのポイント
  • CardLayoutを使用してUP1とUP2を重ねて配置し、Button1とButton2で表示を切り替えたい場合、連続して同じボタンを押すとカード内のオブジェクトが消えてしまう現象が起きる。なぜこの現象が起きるのか疑問。
  • CP.repaint()でカード内のオブジェクトが消えてしまう現象が起きる。
  • 連続して同じボタンを押すとカード内のオブジェクトが消える現象が起きる。
回答を見る
  • ベストアンサー

オブジェクト生成についての疑問

------------------- | Button1 Button2 | ------------------- |   CardLayout   | ------------------- CardLayoutはUP1(UnderPanel)とUP2を重ねて配置。 というレイアウトにした場合、 Button1でカード1(UP1)、Button2でカード2(UP2) を表示させたいのですがその際 public void set1(){ //パネル1へラベル配置 UP1.removeAll(); UP1.add(new JLabel("L1")); } public void setU2(){ //パネル2へラベル配置 UP2.removeAll(); UP2.add(new JLabel("L2")); } public void actionPerformed(ActionEvent e){ if(e.getSource() == B1){ //Button1ならカード1 set1(); CL.show(UP, "u1"); } else if(e.getSource() == B2){ //Button2ならカード2 set2(); CL.show(UP, "u2"); } cp.repaint(); } } ********************** JLabel L1, L2 とはせずにカードが変更される都度JLabelを生成するようにしたいのですが、上記では B1→B2→B1→…と交互に押す分には問題ないのですが、B1→B1と同じボタンを連続して押すと、cp.repaint()でカード内のオブジェクトが消えてしまいます。 なぜこのような現象が起きてしまうのでしょうか?

  • ryo-3
  • お礼率64% (146/226)
  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.1

もし、それがJavaアプリケーションなら、 フレームの右下の隅をドラッグして、 フレームの大きさを変えてみると、 あ~ら不思議、 「消えてしまっている」ラベルが表示されるんじゃないかな? ----- それはともかく… これで解決? ↓ public void actionPerformed(ActionEvent e){ ・ ・ ・ validate();//←最後にこれを入れる } ----- 1つだけリンク http://black.sakura.ne.jp/~third/system/java/Gjava58.html Googleで調べると、 わかりやすく説明したページが、まだあるかも。

ryo-3
質問者

お礼

非常に的確な回答をありがとうございます! 見事に思った通りに実行することができました。 オブジェクトの生成よりも、addの部分だったのですね…。 非常に勉強になりました。これからもJavaを勉強していこうと思います。 どうもありがとうございました!

関連するQ&A

  • 配列要素について

    質問させてください。 JLabel[] label = new JLabel[10]; のようにJLabelを配列で定義して、 public void mouseClicked(MouseEvent e) {} マウスイベント(e.getSource)で クリックされたラベルのオブジェクトを取得した場合、このオブジェクトが何番目の配列要素であるかを知りたいのですが、どのようにすればよいのでしょうか? 詳しい方がおりましたら教えてください。

    • ベストアンサー
    • Java
  • jcpad

    『長方形をあらかじめ置き、、縮小、拡大のボタンを押すことで  縦横を1/1.05倍に縮小できるようにする』 という問題が教科書にあり、拡大、縮小ボタンを作るまではできたのですがそれ以降がうまく考えることができません。 //<applet code= "Counter3.class" width=300 height=150></applet> import java.awt.*; import java.applet.*; import java.awt.event.*; public class Counter3 extends Applet implements ActionListener { Font font; Button kakudaiButton, syukushoButton; public void init() { font = new Font("Serif", Font.BOLD, 72); kakudaiButton = new Button("拡大"); kakudaiButton.addActionListener(this); add(kakudaiButton); syukushoButton = new Button("縮小"); syukushoButton.addActionListener(this); add(syukushoButton); } public void paint(Graphics g) { g.drawOval(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == kakudaiButton) { ; } else if (e.getSource() == syukushoButton) { ; } repaint(); } }

  • シンボルが見つかりませんというエラーが理解できません。

    以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.io.File; public class janken extends Applet implements Runnable, ActionListener { private static final int EXTERNAL_BUFFER_SIZE = 128000; Image image[] = new Image[3]; Thread t; int index1 = 0; int index2 = 0; String msg = ""; String msg1 = ""; boolean state = false; Button b1 = new Button("ぐー"); Button b2 = new Button("ちょき"); Button b3 = new Button("ぱー"); public void init(){ for(int i = 0; i<=2; i++){ img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG"); } add(b1); add(b2); add(b3); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); msg1 = "結果は・・"; } public void paint(Graphics g){ g.drawImage(img[index1],350,30,this); g.drawImage(img[index2],695,30,this); g.drawString("コンピューター",420,300); g.drawString("あなた",800,300); g.drawString(msg,630,320); g.drawString(msg1,550,320); } public void start(){ state = true; t = new Thread(this); t.start(); } public void run(){ while(state){ index1++; if(index1 == 3){ index1 = 0; } index2++; if(index2 == 3){ index2 = 0; } repaint(); try { Thread.sleep(60); }catch(InterruptedException e) { } } } public void actionPerformed(ActionEvent e){ if(state == false) { start(); return; } state = false; if(e.getSource() == b1) { msg = "ぐー"; index2 = 0; } else if(e.getSource() == b2){ msg = "ちょき"; index2 = 1; } else if(e.getSource() == b3){ msg = "ぱー"; index2 = 2; } check(); repaint(); } public void check() { if(index1 == index2) msg ="あいこ"; else if (index1 == 0) { if(index2 == 2) msg="あなたの勝ち"; else msg ="あなたの負け"; } else if(index1 == 1) { if(index2 == 0) msg="あなたの勝ち"; else msg="あなたの負け"; } else if(index1 == 2) { if(index2 == 1) msg="あなたの勝ち"; else msg="あなたの負け"; } } }

    • ベストアンサー
    • Java
  • 音声ファイルの入れ方

    下記ようなじゃんけんゲームでボタンを押した際にwav拡張子の音声ファイルを再生したいのですがどのようにすればよいでしょうか import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.io.File; import javax.sound.sampled.*; public class janken extends Applet implements Runnable, ActionListener { private static final int EXTERNAL_BUFFER_SIZE = 128000; Image image[] = new Image[3]; Thread t; int index1 = 0; int index2 = 0; String msg = ""; String msg1 = ""; boolean state = false; Button b1 = new Button("ぐー"); Button b2 = new Button("ちょき"); Button b3 = new Button("ぱー"); public void init(){ for(int i = 0; i<=2; i++){ image[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG"); } add(b1); add(b2); add(b3); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); msg1 = "結果は・・"; } public void paint(Graphics g){ g.drawImage(image[index1],350,30,this); g.drawImage(image[index2],745,30,this); g.drawString("わたし",420,300); g.drawString("あなた",820,300); g.drawString(msg,630,320); g.drawString(msg1,550,320); }  public void start(){  state = true;  t = new Thread(this); t.start(); } public void run(){ while(state){ index1++; if(index1 == 3){ index1 = 0; } index2++; if(index2 == 3){ index2 = 0; } repaint(); try { Thread.sleep(60); }catch(InterruptedException e) { } } } public void actionPerformed(ActionEvent e){ if(state == false) { start(); return; } state = false; if(e.getSource() == b1) { msg = "ぐー"; index2 = 0; } else if(e.getSource() == b2){ msg = "ちょき"; index2 = 1; } else if(e.getSource() == b3){ msg = "ぱー"; index2 = 2; } check(); repaint(); } public void check() { if(index1 == index2) msg ="あいこ"; else if (index1 == 0) { if(index2 == 2) msg="あなたの勝ち"; else msg ="あなたの負け"; } else if(index1 == 1) { if(index2 == 0) msg="あなたの勝ち"; else msg="あなたの負け"; } else if(index1 == 2) { if(index2 == 1) msg="あなたの勝ち"; else msg="あなたの負け"; } } }

  • 画像処理についておしえてください!

    ここに新たに表示した画像を消去するボタンを 追加したいので教えてください! import java.awt.*; import java.awt.event.*; import java.io.*; import java.applet.Applet; public class k202 extends Frame implements ActionListener { MyCanvas c1; Button b1; Button e1; Image img; Button btnClear; int flag; public k202() { super(); setTitle("Hello"); setSize(500,500); setLayout(null); c1 = new MyCanvas(); c1.setBounds(25,25,250,150); this.add(c1); b1 = new Button("Read"); b1.setBounds(25,200,100,25); b1.addActionListener(this); this.add(b1); e1 = new Button("Clear"); e1.setBounds(50,250,150,50); //ボタンのイベント処理メソッドを定義 e1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ flag = 0; repaint(); } }); } public static void main (String args []) { new k202().show(); } public void actionPerformed(ActionEvent ev) { if (ev.getSource() == b1) { this.readImageFromFile(); } } void readImageFromFile() { try { FileDialog fd = new FileDialog(this,"Select Image File.",FileDialog.LOAD); fd.setVisible(true); String fname = fd.getDirectory() + fd.getFile(); Toolkit tk = Toolkit.getDefaultToolkit(); img = tk.getImage(fname); c1.repaint(); } catch(Exception e) { System.out.println(e); } } class MyCanvas extends Canvas { public void paint(Graphics g) { if (img != null) { g.drawImage(img,0,0,this); } } } }

  • JAVAのプロフラミングについて

    □、○、△のボタンがあり、それぞれのボタンについて 一回押すと、その押したボタンの図形を2個描き、 押すたびに永久的に増えていくというようなプログラム を作りたいのですが、ここからどのようにすればいいのか教えてください。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class kadaiApplet232 extends Applet implements ActionListener { int square = 0; int circle = 0; int triangle = 0; Button squareButton, circleButton,triangleButton; public void init(){ squareButton = new Button("□"); squareButton.addActionListener(this); add(squareButton); circleButton = new Button("○"); circleButton.addActionListener(this); add(circleButton); triangleButton = new Button("△"); triangleButton.addActionListener(this); add(triangleButton); } public void paint(Graphics g){ if(){ g.drawRect(30, 30, square, square); } if(){ g.drawOval(60,30,circle,circle); } if(){ g.drawLine(90+(int)(triangle/2),30,90,30+triangle); g.drawLine(90,30+triangle,90+triangle,30+triangle); g.drawLine(90+triangle,30+triangle,90+(int)(triangle/2),30); } } public void actionPerformed(ActionEvent e){ if ( e.getSource() == squareButton){ square = 30; } else if ( e.getSource() == circleButton){ circle = 30; } else if (e.getSource() == triangleButton){ triangle = 30; } repaint(); } }

    • ベストアンサー
    • Java
  • 内部クラスからはrepaint()は実行できない?

    アプレットを勉強している初心者です。 思うような実行が出来ず public class applet extends Applet{ public void init(){} public void paint(){} class buhin extends Button implements ActionListener{ public buhin(){} public void actionPerformed(ActionEvent e){ repaint();//←これ } } } 大雑把ですがこのような構造で、上の場所からはrepaint()は実行できないのでしょうか?動作からはどうやら出来てないようなのですが、いまいち勘なので・・・。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaアプレット repaintのタイミング

    勉強を始めたばかりなので稚拙な質問ですがお許しください。 ユーザーからの入力→repaint→画面に反映→プログラムが処理→repaint→画面に反映 というターン制のような動かし方をしたいのですが、実際にはユーザーの入力の後、プログラムの処理を待ってからまとめてrepaintしてしまいます。 repaint()は再描画を要求しているだけに過ぎず、repaint()と書いた場所で即時に再描画されるわけではないそうですが、では具体的にすぐ再描画してほしい場合はどうすればいいのでしょうか? 例えばですが、「ボタンを押すとcountの値が+1され、四角がcount個描画される。その一秒後に、こちらが何もしなくてもcountが+2されてもう一度四角がcount個(つまりこの時点で合計三個)描画される」というのを作ってみました。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class question extends Applet implements ActionListener{ Button bt1; int count = 0; public void init(){ bt1 = new Button("start"); add(bt1); bt1.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { bt1.setEnabled(false); count += 1; repaint(); try { Thread.sleep(1000); } catch (InterruptedException e1) { } count += 2; repaint(); bt1.setEnabled(true); } } public void paint(Graphics g){ for(int i = 0; i < count; i++){ g.drawRect(10, 10, 10 + i * 5, 10 + i * 5); } } } これではボタンを押すたびに3つずつ四角が増えているように外見上見えてしまいます。 ボタンを押すとしっかり1つ四角を表示してから一秒待って、2つ四角を増やす。という風にするためにはどうすればよいのでしょうか? どなたかご教示ください。 ちなみにpaintImmediatelyというものを見つけましたが、何故か使えず……(メソッドpaintImmediatelyは未定義ですと言われてしまう)

    • ベストアンサー
    • Java
  • JAVAのプログラミングについて

    色変更というボタンを押すたびに、正方形の中の色が緑から青、青から緑というように繰り返し色が変わるプログラムを作りたいのですが、途中までは、完成できたのですが、ここからどうすればいいかわかりません。教えてください。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class kadai3Applet extends Applet implements ActionListener { int i = 1; Button collor; public void init(){ collor = new Button("色変更"); collor.addActionListener(this); add(collor); } public void paint(Graphics g){ g.setColor(Color.green); g.fillRect(50,50,50,50); } public void actionPerformed(ActionEvent e){ if(e.getSource() == collor){ } repaint(); } }

  • コンポーネントの再描画

    下記のサンプルソースに示したように、レイアウトマネジャーがnullの場合には マウスドラッグでコンポーネントが再描画され、コンポーネントを移動可能なのですが、 スプリングレイアウトマネジャーを設定した同様なサンプルでは、再描画が 行われなくなります(移動はしていますが再描画されないため移動が見えません)。 スプリングレイアウトマネジャーを設定した場合には、フレームをリサイズすれば 再描画されるのですが(サンプルコード中のコメントをはずす)、repaint()等では うまくいきません。 解決策をご存知の方がおられましたら、よろしくお願い申し上げます。 import java.awt.Component; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SpringLayout; public class MouseDraggeSample { private static class NullLayoutSample extends JFrame { public NullLayoutSample() { setLayout( null ); JButton button = new JButton("Button"); button.setSize( 80, 30 ); button.setLocation( 100, 50 ); add( button ); DraggedMouseListener listener = new DraggedMouseListener(); button.addMouseListener( listener ); button.addMouseMotionListener( listener ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize( 300, 200 ); setVisible( true ); } private class DraggedMouseListener implements MouseListener, MouseMotionListener { private Point p0; public void mousePressed(MouseEvent e) { p0 = e.getPoint(); } public void mouseDragged(MouseEvent e) { Component c = (Component)e.getSource(); c.setLocation( c.getX() + e.getX() - p0.x, c.getY() + e.getY() - p0.y ); } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} } } private static class SpringLayoutSample extends JFrame { public SpringLayoutSample() { SpringLayout springLayout = new SpringLayout(); setLayout( springLayout ); JButton button = new JButton("Button"); button.setSize( 80, 30 ); springLayout.putConstraint( SpringLayout.WEST, button, 100, SpringLayout.WEST, this ); springLayout.putConstraint( SpringLayout.NORTH, button, 50, SpringLayout.NORTH, this ); add( button ); DraggedMouseListener listener = new DraggedMouseListener(); button.addMouseListener( listener ); button.addMouseMotionListener( listener ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocation( 300, 0 ); setSize( 300, 200 ); setVisible( true ); } private class DraggedMouseListener implements MouseListener, MouseMotionListener { private Point p0; public void mousePressed(MouseEvent e) { p0 = e.getPoint(); } public void mouseDragged(MouseEvent e) { Component c = (Component)e.getSource(); int x = c.getX() + e.getX() - p0.x; int y = c.getY() + e.getY() - p0.y; SpringLayout layout = (SpringLayout)getContentPane().getLayout(); layout.putConstraint( SpringLayout.WEST, c, x, SpringLayout.WEST, SpringLayoutSample.this ); layout.putConstraint( SpringLayout.NORTH, c, y, SpringLayout.NORTH, SpringLayoutSample.this ); // setSize( getWidth()+1, getHeight() ); // repaint()ではダメ } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} } } public static void main(String[] args) { new NullLayoutSample(); new SpringLayoutSample(); } }

    • ベストアンサー
    • Java

専門家に質問してみよう