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

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

刁远
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()方法的类,并用我的actionperformed()方法为我的jbutton编写了ActionListener,如下所示:

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

我知道如何做剩下的事情,例如addActionListener()和其他东西,因此无需对此进行质疑。我担心的是,调用doTheCleaning()方法时在GUI中所做的所有更改仅在单击按钮后才适用。发生这种情况时,不会显示在我的标签和文本区域中发生的更改之间的连续性。如果我直接在测试器类中调用该代码,则该代码运行良好,但在actionperformed方法内部调用该代码仅显示GUI的最终状态。我需要显示首先更改哪个元素,然后显示下一步,依此类推。

当我仅在单击JButton时才需要进行这些更改时,如何实现?

**我还不太擅长在Java中使用GUI。我希望你们能理解我的观点,而无需我给出代码。但如有必要,我可以。谢谢。


问题答案:

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

  • 重写doInBackground(),并将任何长时间的操作放入此方法内,以便它将在单独的线程而不是EDT上运行。

  • 对于任何GUI创建或其中GUI组件的状态更改doInBackground(),请使用publish(V... chunks)将数据发送到process(List<V> chunks)。您需要覆盖process(List<V> chunks)。另请注意,它process(List<V> chunks)是在EDT上执行的。

  • doInBackground()返回时,done()执行上EDT,你可以重写它使用它的任何GUI更新。您还可以检索返回的值doInBackground()使用get()

  • 请注意,这SwingWorker<T,V>是通用的,您需要指定类型。T从返回的对象的类型doInBackground()get(),而V是你传递到元素的类型process(List<V> chunks)通过publish(V... chunks)

  • execute()方法首先调用Swing工人doInBackground()

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



 类似资料:
  • 我的JButton ActionListener有问题。我在另一个类中定义了一个doTheCleaning()方法,当调用该方法时,会对GUI进行一系列更改。 然后,在另一个类中,我实例化了包含doTheCleaning()方法的类,并用jbutton的actionperformed()方法编写了ActionListener,如下所示: 我知道如何执行其他操作,比如addActionListene

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

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

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

  • 问题内容: 仅在真正更改数据的情况下,才有可能使用“更新后”触发器。我知道“新旧”。但是使用它们时,我只能比较列。例如“ NEW.count <> OLD.count”。 但我想要类似的东西:如果“ NEW <> OLD”,则运行触发器 一个例子: 关键是,有一个更新,但是 什么都没有改变 。但是无论如何,触发器都在运行。恕我直言,应该有一个没有的方法。 我知道我可以使用 如果现在b <> OLD

  • 所以我的代码是: 我希望能够增加仅单击项目的