2014-10-29 60 views
0

我正在尝试创建一个鼹鼠游戏。我用swing创建背景,并添加痣图像与事件监听器,每次点击时增加分数,但我有问题设置它们是否应该可见或不可见。我认为最好的方法是使用定时器来设置/重置布尔(vis)。随机化图像可见的周期将是理想的。我曾尝试多次使用摇摆计时器,但似乎没有工作。我在哪里实例化计时器,以及在计时器倒计时后,我将附加的事件监听器执行代码?在Java中,我将哪些对象附加到Timer类事件侦听器?

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); 
} 
} 

回答

2

在这种情况下,你可以实例化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); 
} 

在此完整exampleGameButtonJToggleButton一个子类,并且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()

相关问题