【问题标题】:Which objects do I attach the Timer class event listener to, in Java?在 Java 中,我将 Timer 类事件侦听器附加到哪些对象?
【发布时间】:2014-10-29 15:14:23
【问题描述】:

我正在尝试创建一个打鼹鼠游戏。我使用swing创建背景并添加带有事件侦听器的鼹鼠图像,每次单击它们时都会增加一个分数,但是我在设置它们是否应该可见时遇到问题。我认为最好的方法是使用计时器来设置/重置布尔值(vis)。随机化图像可见的时间段将是理想的。我曾多次尝试使用摆动计时器,但似乎没有用。在哪里实例化计时器,以及在计时器倒计时后执行代码的事件侦听器附加到什么?

package whackmole;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class WhackAMole extends JFrame {

public WhackAMole() {
    createAndShowGUI();
}

static int score = 0;
public static JLabel scoreDisplay;
boolean vis;

public static void main(String[] args) throws Exception {
    // run asynchronously
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}

private static void createAndShowGUI() {

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setMinimumSize(new Dimension(600, 600));
    Holes holes = new Holes(frame);
    frame.getContentPane().add(holes);
    holes.setLayout(null);
    frame.pack();
    frame.setVisible(true);

    scoreDisplay = new JLabel("Score: " + score);
    scoreDisplay.setBounds(239, 11, 84, 38);
    holes.add(scoreDisplay);

    Mole mole = new Mole(68, 92, true);
    mole.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            score++;
            scoreDisplay.setText("Score: " + score);
        }
    });
    holes.add(mole);

    Mole mole2 = new Mole(181, 320, false);
    mole2.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            score++;
            scoreDisplay.setText("Score: " + score);
        }
    });
    holes.add(mole2);

    Mole mole3 = new Mole(414, 439, true);
    mole3.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            score++;
            scoreDisplay.setText("Score: " + score);
        }
    });
    holes.add(mole3);

    Mole mole4 = new Mole(297, 203, false);
    mole4.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            score++;
            scoreDisplay.setText("Score: " + score);
        }
    });
    holes.add(mole4);
 }
}

【问题讨论】:

    标签: java swing timer timertask


    【解决方案1】:

    在这种情况下,您可以使用固定速率和 implements ActionListener 的类来实例化您的 Timer

    public class Example extends JPanel implements ActionListener {
        private static final int RATE = 1000 / 8; // ~8 Hz
        private final Timer timer = new Timer(RATE, this);
    }
    

    在这个完整的example 中,GameButtonJToggleButton 的子类,ActionListener 的实现只是简单地切换随机选择的GameButton 的状态。

    private final List<GameButton> buttons = new ArrayList<GameButton>(MAX);
    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        if (src == timer) {
            int index = random.nextInt(game.max());
            GameButton gb = buttons.get(index);
            gb.setSelected(!gb.isSelected());
        }
        ...
    }
    

    为了区分状态,该示例使用 Unicode 字形,但您可以使用 setIcon()setSelectedIcon()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多