当前位置: 首页 > 面试题库 >

摇摆计时器无法正常工作

桑坚成
2023-03-14
问题内容

嗨,我正在研究一个项目(Java内存游戏),首先我想了解摆动计时器的工作原理。首先,我主班级实现了ActionListenerItemListener。而且我使用计时器,actionPerformed(ActionEvent e)如果有两张卡用户选择了不同的图片,那么我timer.start()会给他几秒钟的时间来查看图片,然后它们将再次关闭。但是如果用户选择了两张不同的图片,他们会突然关闭,所以我看不到第二张图片。我阅读了一些有关swing
timer的教程,但我想我对SSCCE的创建方式理解不对。如果您能帮助我,我将不胜感激。谢谢anwyway …

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Menu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Random;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.border.*;

public class ConcentrationGame4 extends JFrame implements ActionListener, ItemListener{

    private static final long serialVersionUID = 1L;
    private int buttoncounter=0;
    private int counter = 0;
    private JFrame frame;
    private JPanel mainPanel;
    private JPanel buttonPanel;
    private JMenuBar menuBar;
    private JMenu menu;
    private JMenuItem menuItem;
    private int[] arr = new int[16];
    private int i,j;
    private int random;
    private int size = 4;
    private Icon hidden;
    private GameButton buttonFirst;
    private GameButton buttonSecond;
    private Timer timer;

    private Icon img[] = {UIManager.getIcon("OptionPane.errorIcon"),
            UIManager.getIcon("OptionPane.informationIcon"),
            UIManager.getIcon("OptionPane.warningIcon")};

    private Icon iconList[] = new ImageIcon[size];

    public ConcentrationGame4(){
        createArray();
        initComponents();
    }


    private void initComponents(){

        frame = new JFrame("Concentration Game");
        menuBar = new JMenuBar();
        menu = new JMenu("Menu");
        frame.setJMenuBar(menuBar);
        menuBar.add(menu);
        menuItem = new JMenuItem("New Game");
        menu.add(menuItem);
        menuItem = new JMenuItem("Solve");
        menu.add(menuItem);
        menuItem = new JMenuItem("Exit");
        menu.add(menuItem);
        mainPanel = new JPanel(new BorderLayout(5, 5));
        mainPanel.setBorder(new EmptyBorder(4,4,4,4));
        frame.setContentPane(mainPanel);
        buttonPanel = new JPanel(new GridLayout(4,4,5,5));
        buttonPanel.setBackground(Color.green);

        timer = new Timer(2000,this);

        for(i=0; i<4; i++){

            final GameButton button = new GameButton(iconList[i]);
            button.addItemListener(this);
            button.addActionListener(this);
            buttonPanel.add(button);

        }

        mainPanel.add(buttonPanel, BorderLayout.CENTER);
        frame.setSize(300, 300);
        //frame.pack();
        frame.setLocation(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void itemStateChanged(ItemEvent e){

        GameButton button = (GameButton) e.getItem();

        button.setState();
    }

    public void actionPerformed(ActionEvent e){
        GameButton button = (GameButton) e.getSource();

        if(button.isSelected()){
            buttoncounter++;

            if(buttoncounter==1){
                buttonFirst = (GameButton) e.getSource();
            }
            else if(buttoncounter==2){

                buttonSecond = (GameButton) e.getSource();
                buttoncounter=0;

                    if( checkPairs(buttonFirst,buttonSecond) ) {
                        retirePair(buttonFirst,buttonSecond);
                    }

                    else{   
                        timer.start();
                        falsePair(buttonFirst, buttonSecond);

                    }

            }

    }

    }

    class GameButton extends JToggleButton{

        private static final long serialVersionUID = 1L;
        private Icon icon;

        public GameButton(Icon icon){
            this.icon = icon;
        }

         public void setState() {
                if (this.isSelected() || !this.isEnabled()) {
                    this.setIcon(icon);
                }

                else {
                    this.setIcon(hidden);
                }
            }
        }

    private void retirePair(GameButton a, GameButton b){

        a.setSelected(true);
        a.setEnabled(false);
        b.setSelected(true);
        b.setEnabled(false);

    }

    private void falsePair(GameButton buttonFirst, GameButton buttonSecond){

        buttonFirst.setIcon(hidden);
        buttonFirst.setSelected(false);
        buttonSecond.setIcon(hidden);
        buttonSecond.setSelected(false);
    }

    private boolean checkPairs(GameButton first, GameButton second){
        if(first.getIcon().equals(second.getIcon()))
            return true;
        else
            return false;
    }

    private void createArray(){
        Random rnd = new Random();
        while(i<4){

            random = rnd.nextInt(3)+1;
            if(!includes(random)){
                arr[i]=random;
                iconList[i] = img[random-1];
                i++;
            }
        }
    }

    public boolean includes(int rnd){
        counter=0;
        for(j=0; j<arr.length; j++){

            if(arr[j] == rnd){
                counter++;
                if(counter>1)
                    return true;
            }
        }

        return false;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        new ConcentrationGame4();

    }

}

问题答案:

使用Swing计时器将动作暂停xxx秒的示例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class QuickTimerEg extends JPanel {
   private static final int TIMER_DELAY = 2000;
   private boolean buttonsWorking = true;
   private JButton btn1 = null;
   private JButton btn2 = null;
   private Timer swingTimer;

   public QuickTimerEg() {
      ActionListener btnListener = new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            btnActionPerformed(e);
         }
      };
      setLayout(new GridLayout(4, 4));
      for (int i = 0; i < 4; i++) {
         for (int j = 0; j < 4; j++) {
            JButton button = new JButton("   ");
            button.addActionListener(btnListener);
            add(button);
         }
      }
   }

   private void btnActionPerformed(ActionEvent e) {
      if (!buttonsWorking) {
         return;
      }
      JButton button = (JButton)e.getSource();
      button.setBackground(Color.blue);
      button.setEnabled(false);
      if (btn1 == null) {
         btn1 = button;
      } else {
         buttonsWorking = false;
         btn2 = button;
         swingTimer = new Timer(TIMER_DELAY, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               btn1.setBackground(null);
               btn2.setBackground(null);
               btn1.setEnabled(true);
               btn2.setEnabled(true);
               btn1 = null;
               btn2 = null;
               buttonsWorking = true;               
            }
         });
         swingTimer.setRepeats(false);
         swingTimer.start();
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("QuickTimerEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new QuickTimerEg());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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


 类似资料:
  • 问题内容: 我在游戏中使用了摇摆计时器,但是当游戏运行时,它似乎有平稳运行的时刻和减速的时刻。 为什么时间在波动? 我该如何解决? 这是我的代码示例。在我的实际程序中,我正在绘制图像,而不仅仅是矩形。还有很多碰撞检测和其他小的计算正在发生。 另外,这是游戏的Jar文件的链接,因此您可以运行它,(满是)明白我的意思。http://dl.dropbox.com/u/8724803/Get%20To%2

  • 为了使准确,我喜欢@Tony Docherty On CR建议的逻辑和示例。这是链接。 为了一次又一次地突出显示给定的单词,总是会有几微秒的延迟。如果我有要突出显示的单词,比如说:“你好,你好”,每个单词的值分别是(延迟):200300400毫秒,那么计时器实际花费的时间总是更多。比如说,如果我有很多单词的话,需要216毫秒,而不是200毫秒。。最后,额外的延迟是显而易见的。 我必须突出显示每个字

  • 例: “foo”和“bar”可以是任何字符串键,但它们在键集中应该是唯一的。 我知道,使用Swagger,我可以定义一个对象数组,但这给出了一个不同的API,因为那时我们将拥有如下内容: 我已经阅读了“开放API规范”-“添加地图数据类型支持#38”页面。据我了解,它推荐使用additionalProperties,但似乎并没有回答我的需求(或者说与我使用的Swagger UI 2.1.4不兼容)

  • 问题内容: 我是eclipse的新手,我在eclipse中的计时器无法正常工作,这是我的java。计时器中的代码: 基本上一切都按我的意愿运行,但是,我发现如果在计数时单击触发按钮,它将触发另一个计数而不会停止先前的计数。这非常令人尴尬,如果按钮再次触发,我的朋友建议我执行“切换”操作,并且我正在考虑向同一按钮添加其他操作,以停止重新启动计数。哪一个更可取? 问题答案: 计时器运行时禁用触发按钮。

  • 计划程序的设置: 和@enableScheduling在类中使用@configuration。 问题是fixedDelay正确工作两次,然后在迭代之间暂停1.5分钟。我在计划注释中尝试过fixedRate或cron,但都没有帮助。 方法在调度任务中的工作时间为100ms,项目有足够的内存,但调度程序的工作速度很慢。

  • 我在应用程序中添加了Spring Boot执行器,但现在我想添加由执行器创建的新服务(/health/metrics..)在我大摇大摆的文件上。 我不知道如何配置执行器和大摇大摆。