プロが教えるわが家の防犯対策術!

java初心者です。

やりたいことは、
i_step変数によって、表示する、画像や、パネル(ボタンが作成されています)を替えたいのです。
今はB_Nextボタンによってi_step変数が加算されます。
i_step=1になると、画像が表示されるのですが、
一緒に表示されてほしい【ボタン1】が表示されません。
ですが、マウスアップすると、表示されるようになります。
はじめは【NEXT】ボタンも表示されなかったのですが、
過去の質問を検索し、
http://oshiete1.goo.ne.jp/qa2530138.html
を参照して、super.paint(g);を追加したら、
【NEXT】ボタンは表示されるようになりました。
ソースは以下です。
package guidance_ap;
import java.awt.*;
import javax.swing.*;
public class Test extends JApplet {
Image img1, img2;
private JButton B_Next = null;
private JPanel jContentPane = null;
private JPanel jPanel1 = null;
private JButton b1 = null;
int i_step = 0;

public Test() {
super();
}
public void init() {
this.setSize(640, 480);
this.setContentPane(getJContentPane());
img1 = getImage(getCodeBase(), "test.gif");
img2 = getImage(getCodeBase(), "test2.gif");
}

public void paint(Graphics g) {
super.paint(g);
jContentPane.removeAll();
jContentPane.add(getB_Next(), null);
switch (i_step) {
case 0:
g.drawImage(img1, 0, 0, this);
break;
case 1:
g.drawImage(img2, 0, 0, this);
jContentPane.add(getJPanel1(), null);
break;
}
}

private JPanel getJContentPane() {
if (jContentPane == null) {
try {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.setOpaque(false);
} catch (java.lang.Throwable e) {
e.printStackTrace();
}
}
return jContentPane;
}

private JButton getB_Next() {
if (B_Next == null) {
try {
B_Next = new JButton();
B_Next.setText("NEXT");
B_Next.setLocation(new Point(559, 0));
B_Next.setSize(new Dimension(80, 40));
B_Next.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
i_step++;
repaint();
}
});
} catch (java.lang.Throwable e) {
e.printStackTrace();
}
}
return B_Next;
}

private JPanel getJPanel1() {
if (jPanel1 == null) {
try {
jPanel1 = new JPanel();
jPanel1.setOpaque(false);
jPanel1.setLayout(null);
jPanel1.setSize(new Dimension(640, 480));
jPanel1.setLocation(new Point(0, 0));
jPanel1.setPreferredSize(null);
jPanel1.add(getb1(), null);
} catch (java.lang.Throwable e) {
e.printStackTrace();
}
}
return jPanel1;
}

private JButton getb1() {
if (b1 == null) {
try {
b1 = new JButton();
b1.setSize(new Dimension(190, 40));
b1.setText("ボタン1");
b1.setLocation(new Point(90, 400));
b1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(
java.awt.event.ActionEvent e) {
}
});

} catch (java.lang.Throwable e) {
e.printStackTrace();
}
}
return b1;
}
}

ちなみに【ボタン1】は画像と重なる位置にあります。
super.paint(g);を
paintの最後に記述すると、ボタンは表示されますが、
画像が一瞬でて消えてしまいます。

何がいけないのでしょうか?

A 回答 (1件)

何をやりたいのか、よく分からないので、抜本的なリファクタリングはできませんが、とりあえず、まともなJavaプログラムらしきものに書き直してみました。

よく見て、学習してください。わかんないことは、質問してね。
(全角スペースを半角スペース2つに変えてからコンパイルして。)
あなたが学ぶべきことは山ほどあるけど、たとえば、Swingのメインフレームそのもの(ここではJApplet)のpaint()をオーバライドしてはいけません。必ず、自作のパネルオブジェクトのためのクラス(ここではMyPanel)を書くこと。
----------------------------------------------------
/* do
appletviewer Rabu.java
*/
/*
<applet code="Rabu" width="640" height="480"></applet>
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Rabu extends JApplet {
 Image bimg, img1, img2;
 private JButton bNext, b1;
 private MyPanel jContentPane = null;
 private JPanel jPanel1;
 int iStep;

 public void init() {
  bNext = new JButton("NEXT");

  b1 = new JButton("ボタン1");
  b1.setBounds(90, 400, 190, 40);
  b1.addActionListener(new java.awt.event.ActionListener() {
   public void actionPerformed(ActionEvent e){
   }
  });

  jContentPane = new MyPanel();
  jPanel1 = new JPanel();

  jPanel1.setOpaque(false);
  jPanel1.setLayout(null);
  jPanel1.setBounds(0, 0, 640, 480);
  jPanel1.add(b1);

  // 画像の事前ロードを強制するために
  // ImageIconのコンストラクタにMediaTrackerを
  // ドライブさせる.
  // そのままでは, 画像は実際にpaintされるとき
  // やっとロードされるので, 最初はimg2をかなり待たされる.
  ImageIcon ii1 = new ImageIcon
   (img1 = getImage(getCodeBase(), "images/test.gif"));
  ImageIcon ii2 = new ImageIcon
   (img2 = getImage(getCodeBase(), "images/test2.gif"));
  bimg = img1;

  setContentPane(jContentPane);

  bNext.setBounds(559, 0, 80, 40);
  getContentPane().add(bNext);
  bNext.addActionListener(new ActionListener(){
   public void actionPerformed(java.awt.event.ActionEvent e) {
    iStep++;
    if (iStep % 2 != 0){
     getContentPane().add(jPanel1);
    }
    else{
     getContentPane().removeAll();
     ((JPanel)(getContentPane())).revalidate();
    }
    bimg = (iStep % 2 == 0) ? img1 : img2;
    jContentPane.repaint();
    getContentPane().add(bNext);
   }
  });
 }

 class MyPanel extends JPanel{

  public MyPanel(){
   setPreferredSize(new Dimension(640, 480));
   setLayout(null);
  }

  public void paintComponent(Graphics g){
   super.paintComponent(g);

   if (bimg != null){
    g.drawImage(bimg, 0, 0, 640, 480, this);
   }
  }
 }
}
------------------------------------------
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
教えていただいたソースで実行すると、思うとおりに動きました。
これから、このソースを元に、修正してみます。

本当に、はじめたばかりなので、これからがんばります。
また、わからなければ質問させていただきます。

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

お礼日時:2008/03/07 08:55

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