qua*_*ela 2 java user-interface swing multithreading jtogglebutton
嗨,我正在做一个项目(卡匹配游戏),它几乎完成但事情是当我点击第二个按钮打开图片,如果它不一样,第一次突然关闭.好吧没有错,但用户必须看一下图片(可能是2秒).所以我使用Thread.sleep(2000)但我没有正常工作.它将icon设置为null,然后开始等待2秒.这是我的代码,试图制作一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你能帮助我,我很感激.并感谢无论如何:)
你不想在Swing线程上使用Thread.sleep,因为我确定你已经阅读了如果你做了任何搜索,这样做是为了让Swing进入睡眠状态,睡眠意味着所有绘图都被冻结了,所有用户交互(如对按钮的响应)都被冻结.而是使用Swing Timer,它允许您暂停应用程序,而不会阻止Swing绘制第二个图像并显示2或3秒.逻辑将是:显示两个图像,启动计时器,以及当计时器在2或3秒后"滴答"时(或者您设置延迟的任何内容),隐藏计时器的ActionListener内部的图像.
另外:确保将计时器设置为非重复(有一个摆动计时器的布尔方法来执行此操作).此外,在显示两个图像时,您将要使所有JToggleButtons无响应(或启用== false),然后您希望计时器将所有未配对的按钮设置为响应状态".
| 归档时间: |
|
| 查看次数: |
2135 次 |
| 最近记录: |