- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个有 12 个切换按钮的内存游戏。如果您单击一个按钮,图标就会改变。如果两个图标匹配,则两个图标都会翻转。我在游戏顶部显示了一个已用计时器。我想让计时器在游戏结束时停止;然而,计时器仍然继续运转。这就是我所拥有的:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.*;
import java.util.Collections;
import java.util.Calendar;
import java.time.*;
public class MemoryGame extends JToggleButton implements ActionListener {
private Timer cdTimer;
private Timer swTimer;
private int count = 0;
private long start;
private long begin = Calendar.getInstance().getTimeInMillis();
private JToggleButton[] buttons;
private JToggleButton last;
private JLabel time;
//private String[] commandID = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"};
ArrayList<ImageIcon> iconList = new ArrayList();
ArrayList<JToggleButton> retireButton = new ArrayList();
ImageIcon icon = new ImageIcon("MemoryGame.png");
public MemoryGame() {
JFrame jfrm = new JFrame("Memory Game");
jfrm.setSize(1000, 1000);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrm.setIconImage(icon.getImage());
time = new JLabel("Elapsed time is 00:00:00");
GridLayout layout = new GridLayout(3,4);
JPanel gamePanel = new JPanel();
gamePanel.setLayout(layout);
createIcons();
buttons = new JToggleButton[12];
for(int i = 0; i < buttons.length; i++) {
JToggleButton btn = new JToggleButton(icon);
buttons[i] = btn;
//buttons[i].setActionCommand(commandID[i]);
buttons[i].addActionListener(this);
gamePanel.add(buttons[i]);
}
//Collections.shuffle(Arrays.asList(buttons));
//Collections.shuffle(iconList);
jfrm.add(gamePanel, BorderLayout.CENTER);
time.setHorizontalAlignment(JLabel.CENTER);
time.setVerticalAlignment(JLabel.CENTER);
jfrm.add(time, BorderLayout.NORTH);
jfrm.setLocationRelativeTo(null);
jfrm.setVisible(true);
}
public void actionPerformed(ActionEvent e){
timerStart();
JToggleButton btn = (JToggleButton)e.getSource();
setIcon(btn);
if(last == null){
last = btn;
return;
}
matching(btn, last);
last = null;
}
public void updateTime(){
long temp = Calendar.getInstance().getTimeInMillis();
time.setText("Elapsed time is " + formatTime((long) (temp - begin)) + "-"+retireButton.size());
}
public static String formatTime(long ms){
long millis = ms % 1000;
long x = ms / 1000;
long seconds = x % 60;
x /= 60;
long minutes = x % 60;
x /= 60;
long hours = x % 24;
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
}
private void timerStart(){
ActionListener timerAL = new ActionListener(){
public void actionPerformed(ActionEvent e){
updateTime();
}
};
swTimer = new Timer(1000, timerAL);
swTimer.start();
}
private void timerStop(){
if(retireButton.size() == 12){
long stop = Calendar.getInstance().getTimeInMillis();
time.setText("Elapsed time is " + formatTime((long)(stop-begin)));
swTimer.stop();
}
}
private void setIcon(JToggleButton btn) {
if(btn == buttons[0] || btn == buttons[1])
btn.setIcon(iconList.get(0));
else if(btn == buttons[2] || btn == buttons[3])
btn.setIcon(iconList.get(1));
else if(btn == buttons[4] || btn == buttons[5])
btn.setIcon(iconList.get(2));
else if(btn == buttons[6] || btn == buttons[7])
btn.setIcon(iconList.get(3));
else if(btn == buttons[8] || btn == buttons[9])
btn.setIcon(iconList.get(4));
else if(btn == buttons[10] || btn == buttons[11])
btn.setIcon(iconList.get(5));
}
private void matching(JToggleButton btn, JToggleButton btn2){
if(btn.isSelected()){
if(btn2.isSelected()){
buttonDisable(btn, btn2);
if(!btn.getIcon().toString().equals(btn2.getIcon().toString())){
startTime(1, btn, btn2);
}
else {
retirePair(btn, btn2);
timerStop();
buttonEnable(btn, btn2);
}
}
}
}
private void startTime(int countPassed, JToggleButton btn, JToggleButton btn2){
ActionListener action = new ActionListener(){
public void actionPerformed(ActionEvent e){
if(count == 0){
cdTimer.stop();
unflipPair(btn, btn2);
buttonEnable(btn, btn2);
}
else
count--;
}
};
cdTimer = new Timer(500, action);
cdTimer.start();
count = countPassed;
}
private void buttonEnable(JToggleButton btn, JToggleButton btn2){
if(retireButton.isEmpty()){
for(int i = 0; i < buttons.length; i++){
if(buttons[i] != btn && buttons[i] != btn2)
buttons[i].setEnabled(true);
}
}
else{
for(int i = 0; i < buttons.length; i++){
for(int j = 0; j < retireButton.size(); j++){
if(buttons[i] != btn && buttons[i] != btn2 && buttons[i] != retireButton.get(j))
buttons[i].setEnabled(true);
}
}
}
}
private void buttonDisable(JToggleButton btn, JToggleButton btn2){
for(int i = 0; i < buttons.length; i++){
if(buttons[i] != btn && buttons[i] != btn2)
buttons[i].setEnabled(false);
}
}
private void unflipPair(JToggleButton btn, JToggleButton btn2){
btn.setIcon(icon);
btn2.setIcon(icon);
btn.setEnabled(true);
btn2.setEnabled(true);
btn.setSelected(false);
btn2.setSelected(false);
}
private void retirePair(JToggleButton btn, JToggleButton btn2){
btn.setEnabled(false);
btn2.setEnabled(false);
btn.setSelected(true);
btn2.setSelected(true);
retireButton.add(btn);
retireButton.add(btn2);
}
private void createIcons(){
ImageIcon icon1 = new ImageIcon("1.png");
ImageIcon icon2 = new ImageIcon("2.png");
ImageIcon icon3 = new ImageIcon("3.png");
ImageIcon icon4 = new ImageIcon("4.png");
ImageIcon icon5 = new ImageIcon("5.png");
ImageIcon icon6 = new ImageIcon("6.png");
iconList.add(icon1);
iconList.add(icon2);
iconList.add(icon3);
iconList.add(icon4);
iconList.add(icon5);
iconList.add(icon6);
}
所以我创建了一个退休按钮的数组列表。我为计时器设置的停止条件是,如果退出按钮数组列表大小达到12(即游戏中按钮的总数),则计时器停止;然而,它只是继续下去。我不知道我做错了什么。请帮忙谢谢。
最佳答案
这是我看到的一个问题 - 您正在创建很多 Timer 实例,您将它们放入 swTimer 变量中,但只尝试停止最后一个实例,而所有其他实例仍在继续运行。一种可能的解决方案 - 在创建新的 Timer 实例之前,查看当前是否正在运行,如果是,则停止它。
例如,
private void timerStart() {
ActionListener timerAL = new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateTime();
}
};
// check if swTimer is not null and is currently running
if (swTimer != null && swTimer.isRunning()) {
swTimer.stop(); // !! if so STOP it!
}
swTimer = new Timer(1000, timerAL);
swTimer.start();
}
话虽如此,您真的需要创建所有这些新的 Timer 实例吗?难道单个实例不能工作吗?一个实例在按下第一个按钮时启动,仅在游戏结束时停止?
附带问题(与当前问题无关):
MemoryGame 扩展 JToggleButton
。该游戏绝对不是 JToggleButton,因此您不应该让该类扩展此类。关于java - Swing - 当内存游戏结束时计时器不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52788745/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!