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

正确更新秋千组件?

沈伟
2023-03-14
问题内容

我是新手,不胜感激。

在这段代码中,我要把一张卡片面朝上,如果发现它们不匹配,我希望它们再次面朝下。

此刻正在发生的事情: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");
        }
    }
}

问题答案:

您似乎缺少许多重要的概念。

  1. 摇摆是事件驱动的环境。这意味着您没有办法(或至少只有很少几种)可以“等待”用户输入,通常,您只需要对他们的交互做出反应即可。
  2. Swing由单个线程驱动,称为事件调度线程(AKA EDT)。该线程负责将进入应用程序的事件分派/处理到应用程序的适当部分,以便事件可以采取行动。
  3. 重涂管理器将其更新请求发布到EDT上。

您采取的任何阻止EDT进行这项工作的措施,都会使您的应用程序看起来像挂了一样。

您绝不能Thread#sleep在EDT上执行任何耗时的操作(例如I / O,循环等),这样做会使您的应用程序“暂停”,这从来都不是很漂亮的。

通读Swing中的并发以获取更多信息。

现在,您有许多选择。您可以使用a Thread在后台“等待”并向后转卡片,也可以使用a SwingWorker或a
javax.swing.Timer

您遇到的另一个问题是,Thread除EDT之外,切勿更新任何UI组件。这意味着,如果您使用Thread,则将负责将该线程与EDT重新同步。虽然并不困难,但只是变得凌乱。

SwingWorkerjavax.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?