ボタンで起動する動作

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
daj

ボタンで起動する動作

#1

投稿記事 by daj » 13年前

javaです。
下のコードは私が作成しているプログラムの簡易版で、
タイトル画面のスタートボタンを押すことで画像が40種表示される表示されるものなんですが、
ボタンを押しても何もおきません。どうすればちゃんと動くようになるか教えていただけないでしょうか。

画像は40種、0.gif~39gifをdataフォルダに用意していることが前提

コード:

java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test1 extends JPanel{
    public static void main(String[] args){
        JFrame frame = new JFrame("Test");
        Title title=new Title();
        frame.setSize(800,600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.add(title);
    }
}
class Title extends JPanel{//タイトル画面部分
    JButton button;
    Title(){
        setLayout(null);
        button=new JButton("Start");
        button.setBounds(250,300,300,25);
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                new Gif();
            }
        });
        add(button);
    }
}
class Gif extends JPanel{//GIF画像が40種表示されるようにしている部分
    Image[] img=new Image[40];
    Gif(){
        for(int i=0;i<40;i++)
            img[i]=getToolkit().getImage("data\\"+i+".gif");
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(int i=0;i<160;i++){
            if(img[i]!=null)g.drawImage(img[i],16+(i%20)*24,40+i/20*32,null);
        }
        setBackground(Color.GREEN);
    }
} 

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: ボタンで起動する動作

#2

投稿記事 by ISLe » 13年前

Gifクラスのインスタンスを作成しただけでは何も変わりません。

最小限の変更で済ますとしたらこんな感じでしょうか。

コード:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test1 extends JPanel{
    public static void main(String[] args){
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Title title=new Title(frame); // [変更]フレームインスタンスを渡す
        frame.setSize(800,600);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.add(title);
    }
}
class Title extends JPanel{//タイトル画面部分
    JButton button;
    Title(final JFrame frame){ // [変更]フレームインスタンスを受け取る
        setLayout(null);
        button=new JButton("Start");
        button.setBounds(250,300,300,25);
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
				frame.remove(Title.this); // [追加]フレームから自身を削除
                frame.add(new Gif()); // [変更]フレームにセット
                frame.validate(); // [追加]フレームレイアウトの再計算要求
            }
        });
        add(button);
    }
}
class Gif extends JPanel{//GIF画像が40種表示されるようにしている部分
    Image[] img=new Image[40];
    Gif(){
        setBackground(Color.GREEN); // [移動]
        for(int i=0;i<40;i++)
            img[i]=getToolkit().getImage("data\\"+i+".gif");
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(int i=0;i<160;i++){
            if(img[i%40]!=null)g.drawImage(img[i%40],16+(i%20)*24,40+i/20*32,this); // [修正]
        }
    }
}
Title,Gifクラスがフレームに直接アクセスすると応用しにくくなります。
フレームとTitle,Gifクラスを介在する、シーン遷移を管理するクラスを作成して使うようにすると良くなります。

あと、この形ではTest1クラスがJPanelである意味がないので、JFrameを継承すべきかと。

daj

Re: ボタンで起動する動作

#3

投稿記事 by daj » 13年前

ありがとうございます!
これを参考にしたらうまく動作しました!

閉鎖

“C言語何でも質問掲示板” へ戻る