Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java的内存游戏中保持两张图片打开一段时间_Java_Multithreading_Swing_User Interface_Jtogglebutton - Fatal编程技术网

在java的内存游戏中保持两张图片打开一段时间

在java的内存游戏中保持两张图片打开一段时间,java,multithreading,swing,user-interface,jtogglebutton,Java,Multithreading,Swing,User Interface,Jtogglebutton,您好,我正在做一个项目(卡片匹配游戏),它几乎完成了,但事情是当我点击第二个按钮打开图片,如果它与第一个不一样,它突然关闭。没什么不对,但用户必须看一段时间(可能2秒钟)。所以我使用了Thread.sleep(2000),但我不能正常工作。它将图标设置为空,然后开始等待2秒。这是我的代码a试图做一个SSCCE import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.a

您好,我正在做一个项目(卡片匹配游戏),它几乎完成了,但事情是当我点击第二个按钮打开图片,如果它与第一个不一样,它突然关闭。没什么不对,但用户必须看一段时间(可能2秒钟)。所以我使用了
Thread.sleep(2000)
,但我不能正常工作。它将图标设置为空,然后开始等待2秒。这是我的代码a试图做一个SSCCE

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 java.util.Vector;

import javax.swing.BorderFactory;
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.UIManager;
import javax.swing.border.*;

public class ConcentrationGame3 extends JFrame {

    /**
     * 
     */
    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;
    int k=0;

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

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

    public ConcentrationGame3(){

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

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

            final GameButton button = new GameButton(new JToggleButton(),iconList[i]);
            button.addItemListener(new ItemListener(){
                public void itemStateChanged(ItemEvent e){

                    button.setState();
                }
            });

            button.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){

                        try {
                            buttonActionPerformed(e,button);
                        } catch (InterruptedException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                }
            });
            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);
    }

    class GameButton extends JToggleButton{

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

        public GameButton(JToggleButton gameButton,Icon icon){

            this.gameButton = gameButton;
            this.icon = icon;
        }

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

    private void buttonActionPerformed(ActionEvent e, GameButton button) throws InterruptedException {
        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{
                            Thread.sleep(2000);
                            buttonFirst.setIcon(hidden);
                            buttonFirst.setSelected(false);
                            buttonSecond.setIcon(hidden);
                            buttonSecond.setSelected(false);

                    }

            }
        }
    }

    private void retirePair(GameButton a, GameButton b){
        a.setSelected(true);
        a.setEnabled(false);
        b.setSelected(true);
        b.setEnabled(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 ConcentrationGame3();

    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.GridLayout;
导入java.awt.Image;
导入java.awt.Menu;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.ItemEvent;
导入java.awt.event.ItemListener;
导入java.util.Random;
导入java.util.Vector;
导入javax.swing.BorderFactory;
导入javax.swing.Icon;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JMenuItem;
导入javax.swing.JPanel;
导入javax.swing.JToggleButton;
导入javax.swing.UIManager;
导入javax.swing.border.*;
公共类集中式游戏3扩展了JFrame{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
私有int按钮计数器=0;
专用整数计数器=0;
私有JFrame;
私人JPanel主面板;
私人JPanel按钮面板;
私人杰门努巴·梅努巴;
私人菜单;
私有项目菜单项;
私有整数[]arr=新整数[16];
私人int i,j;
私有整数随机;
私有整数大小=4;
隐藏私人图标;
私人游戏按钮按钮第一;
私人游戏按钮秒;
int k=0;
私有图标img[]={UIManager.getIcon(“OptionPane.errorIcon”),
UIManager.getIcon(“OptionPane.informationIcon”),
UIManager.getIcon(“OptionPane.warningIcon”)};
私有图标图标列表[]=新图像图标[大小];
公共集中游戏3(){
createArray();
初始化组件();
}
私有组件(){
框架=新的JFrame(“专注游戏”);
menuBar=newjmenubar();
菜单=新JMenu(“菜单”);
frame.setJMenuBar(菜单栏);
菜单栏。添加(菜单);
menuItem=新项目(“新游戏”);
menu.add(menuItem);
menuItem=新项目(“解决”);
menu.add(menuItem);
menuItem=新项目(“退出”);
menu.add(menuItem);
主面板=新JPanel(新边界布局(5,5));
主面板订单(新的清空订单(4,4,4,4));
frame.setContentPane(主面板);
buttonPanel=新JPanel(新网格布局(4,4,5,5));
按钮面板。挫折背景(颜色。绿色);

对于(i=0;i您不想在Swing线程上使用Thread.sleep,因为我确信您已经阅读了如果您进行了任何搜索,那么这会使Swing进入睡眠状态,睡眠意味着所有绘图都被冻结,所有用户交互(如对按钮的响应)都被冻结已冻结。请改用Swing计时器,该计时器将允许您暂停应用程序,而不会阻止Swing绘制第二个图像并在2秒或3秒内同时显示这两个图像。逻辑将是:显示两个图像,启动计时器,并在2秒或3秒后计时器“滴答”时(或设置延迟的任何值),将图像隐藏在计时器的ActionListener中


另外:确保将计时器设置为非重复(Swing timer有一个布尔方法可以实现这一点)。此外,在显示两个图像时,您需要使所有JToggleButtons无响应(或enabled==false),然后您希望计时器在“滴答”时将所有未配对的按钮设置为响应状态.

不,你没有把它变成SSCCE;你把问题中所有的代码都扔了,然后问“怎么了?”我觉得奇怪的是,你的
GameButton扩展了JToggleButton
,但也需要它的客户端为构造函数构造一个
JToggleButton
,并且还存储了一个
JToggleButton
。从我对Java的回忆来看,
extends
是一个“is-a”关系,但你使用它时就好像它是一个“has-a”关系一样关系。@Brian好的,是的,但是这个代码有100多行和图片,我专门用在我的电脑上。我不是在问“好吧,有什么问题,请给我代码”.请仔细阅读…我不知道为什么只有一个线程时会标记为多线程。也许您应该有多个线程。这至少是整个线程的一个较小版本--我将对此给予赞扬(1+),并允许我在发布答案之前轻松测试工作解决方案。@quartaela:将此链接标记为书签:。然后在该页面上搜索Swing计时器。