2014-10-29 23 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()

相關問題