К каким объектам я могу подключить прослушиватель событий класса Timer в Java?

Я пытаюсь создать игру «Ударь крота». Я использовал качели для создания фона и добавления изображений кротов с прослушивателями событий, которые увеличивают счет каждый раз, когда они нажимаются, но у меня возникают проблемы с настройкой того, должны ли они быть видимыми или нет. Я подумал, что лучший способ сделать это — использовать таймер для установки/сброса логического значения (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);
 }
}

person jacka92    schedule 29.10.2014    source источник


Ответы (1)


В этом контексте вы можете создать свой экземпляр Timer с фиксированной скоростью. и класс, который implements ActionListener.

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

В этом полном примере GameButton является подклассом JToggleButton, а реализация 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().

person trashgod    schedule 29.10.2014