2010-10-28 127 views
2

我试图做出补救西蒙说喜欢使用游戏秋千(JFrame中/ Jbuttons中/格设置)。目前我无法弄清楚如何获得一系列闪光灯按钮。由于actionPerformed是非静态的,因此我无法通过摆动计时器运行线程。我不知道该怎么办。的Java Swing闪烁的按钮序列

我会很感激,如果有人可以拿我的代码一目了然,并提供洞察力。

package MemoryGame; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.util.Random; 
import java.lang.InterruptedException; 

public class GUI { 

    static int seconds = 0; 
    static int buttonIndex = 0; 
    int[] movesArr = new int[10]; 
    int numberOfButtons = 18; 
    Thread thread = new Thread(); 
    boolean[] logicArr = new boolean[numberOfButtons]; 
    JFrame frame   = new JFrame("Memory Builder"); 
    JPanel buttonPanel = new JPanel(); 
    JPanel panelBot  = new JPanel(new BorderLayout()); 
    GridLayout grid  = new GridLayout(0, 3) {{ setHgap(8); setVgap(8); }}; 
    JLabel scoreLabel = new JLabel("Score"); 
    static JLabel timeLabel  = new JLabel("0"); 
    JButton button[]  = new JButton[numberOfButtons]; 
    Listener listener = new Listener(); 
    Timer displayTimer = new Timer(1000, listener.new DisplayTimeListener()); 
    Timer buttonTimer = new Timer(300, listener.new ButtonDisplayListener()); 
    Color buttonColor; 

    public GUI() { 

     //Setup frame 
     frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create button panel 
     buttonPanel.setLayout(grid); 
     buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     addButtonPanel(); 

     //create label pane 
     panelBot.add(timeLabel, BorderLayout.WEST); 
     panelBot.add(scoreLabel, BorderLayout.EAST); 
    } 

    public void centerFrame() { 

     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     frame.setLocation((dim.width - frame.getWidth())/2, 
       (dim.height - frame.getHeight())/2); 
    } 

    public void addButtonPanel() { 

     for (int i=0; i < button.length; i++){ 
      button[i] = new JButton(); 
      button[i].addActionListener(listener.new ButtonListener()); 
      button[i].setText("Button " + (i + 1)); 
      button[i].setName(new Integer(i).toString()); 
      buttonPanel.add(button[i]); 
     } 

     buttonColor = button[0].getBackground(); 
    } 


    public void createGUI() { 
     frame.add(buttonPanel); 
     frame.add(new JSeparator()); 
     frame.add(panelBot);   
     frame.pack(); 
     centerFrame(); 
     buttonPanel.setVisible(true); 
     frame.setVisible(true); 
     displayTimer.start(); 
     runGame(); 
    } 

    public void runGame() { 

     boolean isGameOver = false; 
     int difficulty = 3; 
     Random random = new Random(); 

     //generate and display random sequence 
     for(int i = 0; i < difficulty; i++) { 
      movesArr[i] = random.nextInt(numberOfButtons); 
      System.out.println(movesArr[i]); 
     } 
     new BlinkThread().run(); 

    } 



    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run(){ 
       new GUI().createGUI(); 
      } 
     }); 
    } 

    public class Listener { 


    boolean flag = true; 

    public class ButtonDisplayListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      if (flag){ 
       button[buttonIndex].setBackground(Color.red); 
       flag = !flag; 
      } 
      else button[buttonIndex].setBackground(buttonColor); 

     } 
    } 

    public class DisplayTimeListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      GUI.timeLabel.setText(new Integer(seconds++).toString()); 
     } 
    } 

    public class ButtonListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
     } 
    } 

} 

class BlinkThread implements Runnable { 
    public void run(){ 

     for(int i: movesArr){ 
      try{ 
       Thread.sleep(200); 
       System.out.println("echo"); 
       button[i].setBackground(Color.RED); 
       Thread.sleep(200); 
       button[i].setBackground(buttonColor); 
      } 
      catch(Exception ex){} 
     } 

    } 
} 
} 

回答

3

您可以创建自己的线程(或者更确切地说,一个Runnable)是闪烁的按钮和通话之间,例如睡觉

class FlashThread implements Runnable { 
    private int[] indices; 
    private int sleepTime; 
    ... suitable constructor 
    public void run() { 
     for (int i : indices) { 
      buttonOn(i); 
      Thread.sleep(sleepTime); 
      buttonOff(i); 
      Thread.sleep(sleepTime); 
     } 
    } 
} 

这应该做的伎俩。

或者,你可以创建一个定时器,并添加一个ActionListener它(类似于您正在使用ButtonDisplayListener等做什么),做中闪烁。

顺便说一句,不通过runGame每一次循环中创建一个新的随机对象()。生成一次(最好作为一个实例变量而不是本地变量),然后多次使用它。随机对象的生成(可能)是昂贵的,并且生成一堆Random对象有些失败了Random类的用途。

+0

谢谢you______________ – 2010-10-28 15:39:03

+0

我做你的跟帖说什么,我认为它的工作原理,但它显示按钮的面板之前确实闪烁的顺序,我怎么能解决这个问题(我更新的代码) – 2010-10-28 15:58:08

3

正如@Cameron Skinner所建议的那样,example使用javax.swing.Timer来闪烁按钮以进行简单的匹配游戏。 Timer对此尤其方便,因为其动作事件处理程序在事件分派线程上执行。