2

タイマーを使用する信号機シミュレーションのアニメーションを作成しようとしています。シミュレーションを停止するボタンがありますが、クリックしてもアニメーションには影響しないようです。アニメーションをチェックインしましたが、アニメーションは別の場所のようです。助けてください。

メインクラスでは:

DataModels dm = new DataModels();
Simulation sm = new Simulation(dm);
sm.go();

シミュレーションクラスは次のとおりです。

public class Simulation extends JPanel implements ActionListener {
    DataModels dm;
    Timer tm = new Timer(20, this);
    private boolean ss = false;

    public Simulation(DataModels dm) {
        this.dm = dm;
        // redLightTime= dm.getRedLight()*1000;
    }

    public void go() {
        sm = new Simulation(dm);
        simulation = new JFrame();
        simulation.setTitle("Traffic light and Car park Siumulation");
        simulation.setSize(800, 700);
        simulation.setResizable(false);
        simulation.setVisible(true);
        simulation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        simulation.add(sm, BorderLayout.CENTER);

        // Command button panel
        JPanel command = new JPanel();
        command.setPreferredSize(new Dimension(800, 100));
        // Pause or play button
        JButton pauseplayB = new JButton("Pause");
        pauseplayB.setSize(new Dimension(50, 50));
        pauseplayB.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                // Execute when button is pressed
                ss = true;
                System.out.println("You clicked the button");
            }
        });
        command.add(pauseplayB);
        JButton stopB = new JButton("Stop");
        JButton saveB = new JButton("Save");

        command.setLayout(new GridLayout(1, 1));
        command.add(stopB);
        command.add(saveB);
        simulation.add(command, BorderLayout.SOUTH);
    }

paintComponentタイマーの変更に基づいて変更されます。次のコードもSimulationクラスにあります。

public void paintComponent(Graphics g) {
    // Many other actions
    // ....
    startAnimation();
}

public void startAnimation() {
    if ( !false) {
        tm.start();
    } else {
        tm.stop();
    }
    // Checking button click
    System.out.println(ss);
}

コンソール出力によると、ss値は決して変化しません。

4

2 に答える 2

4

ボタンのアクション リスナーは、関数を呼び出して何らかの方法でタイマーを停止する必要があり、それを行うためにペイント イベントに依存する必要はありません。

編集:ここにいくつかのコードがあります:)

public void actionPerformed(ActionEvent e) {
    // Execute when button is pressed
    ss = true;
    System.out.println("You clicked the button");
    startAnimation();
}

また、startAnimation メソッドには、if(!false) ではなく if(!ss) が必要です。

于 2012-08-29T19:44:49.057 に答える
3

JTMonの提案に加えて、startAnimationメソッドにはロジックボムが含まれています

public void startAnimation() {
    if ( !false) { //<-- this will ALWAYS be true
        tm.start();
    } else {
        tm.stop();
    }
    // Checking button click
    System.out.println(ss);
}

タイマーを制御するifステートメントは、常にタイマーを試行して開始します

于 2012-08-29T20:31:11.150 に答える