我是新手,不胜感激。
在这段代码中,我要把一张卡片面朝上,如果发现它们不匹配,我希望它们再次面朝下。
此刻正在发生的事情:1.单击第一张卡片时翻转2.单击第二张卡片时,发生以下两种情况中的任何一种(a)如果它们相同,它们都停留在我想要的状态(b)如果它们并不相同,我根本看不到第二张卡,因为第二张卡会立即重新显示卡的背面(以及我的方法中定义的上一张卡的背面)。
我以为放入睡眠计时器可能会使第二张卡显示一段时间后再返回,但事实并非如此。
我试图使用contentPane.revalidate(); &contentPane.repaint(); 但这并没有改变任何东西。
我输入了一些控制台输出:
Console output:
Card: 0 set
Card: 6 set
Sleeping now
Card: 6 unset
Card: 0 unset
上面是单击两个不匹配的卡时生成的控制台输出
@Override
public void actionPerformed(ActionEvent e)
{
String buttonPressed = e.getActionCommand();
int pos = Integer.valueOf(buttonPressed);
action = Control.model.ReceiveCardsTurned(pos);
keypadArray[pos].setIcon(myIcons[pos]);
System.out.println("Card: "+pos+" set");
currentTime.setText("" + Control.model.time);
currentScore.setText("" + Control.model.score);
//contentPane.revalidate();
//contentPane.repaint();
if(Control.model.twoCardsTurned == false)
{
if (action == "unturn")
{
System.out.println("Sleeping now");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
keypadArray[pos].setIcon(back);
keypadArray[Control.model.lastCard].setIcon(back);
System.out.println("Card: "+pos+" unset");
System.out.println("Card: "+Control.model.lastCard+" unset");
}
}
}
您似乎缺少许多重要的概念。
您采取的任何阻止EDT进行这项工作的措施,都会使您的应用程序看起来像挂了一样。
您绝不能Thread#sleep
在EDT上执行任何耗时的操作(例如I / O,循环等),这样做会使您的应用程序“暂停”,这从来都不是很漂亮的。
通读Swing中的并发以获取更多信息。
现在,您有许多选择。您可以使用a Thread
在后台“等待”并向后转卡片,也可以使用a SwingWorker
或a
javax.swing.Timer
。
您遇到的另一个问题是,Thread
除EDT之外,切勿更新任何UI组件。这意味着,如果您使用Thread
,则将负责将该线程与EDT重新同步。虽然并不困难,但只是变得凌乱。
SwingWorker
并javax.swing.Timer
具有使操作变得更加容易的功能。
线程和SwingWorker
非常适合执行后台处理,并且对于该问题而言简直是过分杀伤力。相反,a javax.swing.Timer
非常适合这里。
if (!Control.model.twoCardsTurned)
{
if ("unturn".equals(action))
{
new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
keypadArray[pos].setIcon(back);
keypadArray[Control.model.lastCard].setIcon(back);
System.out.println("Card: "+pos+" unset");
System.out.println("Card: "+Control.model.lastCard+" unset");
}
}).start();
}
}
这是一个非常简单的例子。您可能希望添加一些控件,例如,在计时器启动之前,这些控件将阻止用户单击任何内容。
错误消息:我想它说我的输入是int,即使它们被设置为String。我该怎么办? RPSL. java: 57:错误:不兼容类型:字符串不能转换为int结果[user武器][computer武器]=possibleTie; RPSL。java:57:错误:不兼容的类型:无法将字符串转换为int 结果[UserBearm][ComputerBearm]=possibleTie;
问题内容: 我已经将一些JPanels放到另一个JPanel中,它的布局是Box Layout和Y轴。在放置所有面板之后,我需要从JPanel容器面板中获取每个添加的JPanel的Y位置。但是,当我尝试获得该值时,每个JPanel的Y位置总会得到零。请告诉我如何从JPanel容器JPanel获取每个Jpanel的Y位置。 这就是我所做的 问题答案: 将您的内容添加到s的 contentPane中,
我正在尝试使用useReducer更新组件的状态。我在useEffect中从mongodb获取了一些信息,在那里我调用了我的useReducer dispatch,以便在组件装载后立即设置我的状态。不幸的是,我的状态没有受到影响,我的UI也没有改变。控制台。useffect语句末尾的log语句显示我的状态仍然具有useReducer调用中设置的初始值。有人能告诉我哪里出了问题吗?另外,我计划稍后在
问题内容: 我正在使用Eclipse IDE开发桌面(秋千)应用程序。我有三个组合框(国家,州和城市),选择新的国家或省时需要自动更新数据。我搜索了很多信息,但是我发现的所有实现都是在Ajax或NetBeans中的bean绑定框架上完成的。我通过ItemEvent尝试了一种解决方案,但是在启动应用程序时遇到了问题,该应用程序加载了国家列表,但没有加载其他列表。通过选择一个国家,国家列表而不是城市列
问题内容: 这可能看起来很奇怪。 我已经用Java(在Eclipse中)编写了代码。然后,我对代码进行了一些修改。现在,我正在尝试运行新代码(已修改),但是它仍然为我提供了先前代码的输出。 我在代码中放置了很少的调试点,但是它跳过了一些调试点(尽管它应该在它们处停止)并在某个调试点处停止,但是即使在这里,它也调用了先前代码中存在的方法。位置(尽管我已经对此发表了评论)。从某个地方看来,它仍然在调试
假设我有一个应用程序,其中REST API更新产品的价格。 我想使用微米计来公开新价格作为指标。我无法理解微米计留档应该如何完成。 唯一对我有效的DoubleFunction是在我的ProductService中创建一个新方法来返回它的价格。这似乎是我想公开作为指标的每一条数据的开销。 我这里缺少什么?为什么不足以更新Gauge?