当前位置: 首页 > 知识库问答 >
问题:

JButton ActionListener-GUI仅在单击JButton后更新

盖晋
2023-03-14

我的JButton ActionListener有问题。我在另一个类中定义了一个doTheCleaning()方法,当调用该方法时,会对GUI进行一系列更改。

public void doTheCleaning(){
    //change image icon
    //had thread.sleep here
    //insert to text area
    //had thread.sleep here
    //etc
}

然后,在另一个类中,我实例化了包含doTheCleaning()方法的类,并用jbutton的actionperformed()方法编写了ActionListener,如下所示:

public void actionPerformed(ActionEvent e){
   //some code
   //newClass.doTheCleaning();
}

我知道如何执行其他操作,比如addActionListener()和其他东西,所以不需要对此提出疑问。我关心的是,调用doTheCleaning()方法时在GUI中执行的所有更改仅在单击按钮后才应用。当发生这种情况时,在我的标签和textarea中发生的更改之间的顺序没有显示。如果我直接在tester类中调用它,那么代码可以正常工作,但是在actionperformed方法中调用它只显示GUI的最终状态。我需要显示哪个元素首先更改,然后是什么,依此类推。

当我需要这些更改只在单击JButton时发生时,我如何实现它呢?

**我还不太擅长用java做GUI。我希望你们能理解我的观点而不需要我给出我的代码。但如果有必要的话我可以。多谢了。

共有1个答案

笪烨
2023-03-14

不要在EDT中执行任何密集操作,否则GUI将没有响应,您可能看不到GUI更新。您可以使用的最佳选择是SwingWorker:

>

  • 重写doinbackground(),并将任何长操作放在此方法中,使其运行在单独的线程上,而不是EDT上。

    对于doinbackground()中的任何GUI创建或更改GUI组件的状态,请使用publish(v...chunks)将数据发送到进程(list chunks) 。您需要重写进程(列表 块) 。还要注意,process(list chunks) 是在EDT上执行的。

    doinbackground()返回后,done()在EDT上执行,您可以重写它以将其用于任何GUI更新。还可以使用get()检索从doinbackground()返回的值。

    请注意,swingworker 是泛型的,您需要指定类型。T是从DoInBackground()Get()返回的对象类型,而V是通过Publish(v..chunks)传递给进程(列表 块) 的元素类型。

    execute()方法通过首先调用DoInBackground()来启动swing工作者。

    有关这方面的更多信息,请阅读Swing中的并发。

  •  类似资料:
    • 问题内容: 我的JButton ActionListener出现问题。我在另一个类中定义了doTheCleaning()方法,该类在调用时对我的GUI进行了一系列更改。 然后在另一个类中,我实例化了包含doTheCleaning()方法的类,并用我的actionperformed()方法为我的jbutton编写了ActionListener,如下所示: 我知道如何做剩下的事情,例如addActio

    • 问题内容: 我在NetBeans中设计了两个JFrame。 当我单击“规则”按钮(即放在JFrame1上)时,它将打开第二个JFrame(但JFrame2在JFrame1的窗口上打开,这是我不想要的)。在第二个JFrame中,有一个“关闭”按钮。但是,当我单击此按钮时,我希望打开JFrame1并且它也能正常工作,但是JFrame2实际上没有关闭,并且JFrame1出现在JFrame2上方。 简而言

    • 问题内容: 我创建了一个扩展JDialog的类,其中有一些复选框和3个按钮:接受,取消和全选。 当用户单击全选时,应选中每个复选框,如果再次单击,则应取消选中每个复选框。效果很好,但我还希望按钮的文本在“全选”和“全选”之间切换。我在这里遇到了麻烦,因此当用户单击按钮并将文本更改为“取消全选”时,该按钮消失了。 我在这里将类简化为最简单的形式: 我看不出有什么问题。有什么帮助吗? 问题答案: 该按

    • 我正在尝试做一些非常简单的事情,在点击按钮时更改文本。 我似乎无法使用它,有人能告诉我添加ActionListener的正确位置吗? 主要类别 atmGUI类 编辑: 这是产生的错误 类型new ActionListener(){}必须实现继承的抽象方法ActionListener.actionPerform(ActionEvent)

    • 当我的JButton被点击时,我的JPanel不会出现。当我在go()方法中添加JPanel时,它确实会出现。然而,当我尝试通过单击JButton来执行它时,它并不起作用。但是,程序会进入侦听器的actionPeformed()方法的循环。

    • 问题内容: 如何更改的上一个点击的时候? 我试图让3个按钮将样式分别更改为或或 我已经读过,但是我没有什么比我们只能 我发现Java中的字体类比应该的:S更复杂。 问题答案: 您需要调用not setStyle。 例如,如果要保留相同的字体,但更改名为“ field”的JTextField的样式,则可以执行以下操作: 编辑 要将字体设置为粗体和斜体,可以使用位图或位图: 请注意,这使用的是按位包含