Java JButton文本未更改

Java JButton文本未更改,java,swing,user-interface,jpanel,jbutton,Java,Swing,User Interface,Jpanel,Jbutton,因此,我的代码基本上有一个带有一些文本字段的JPanel和一个JButton,当用户单击按钮时,它会转到按钮侦听器,然后按钮侦听器从文本字段获取数据并对其进行处理,创建jlabel,并将其添加到另一个不可见的JPanel。然后,我使第一个JPanel不可见,并使第二个面板可见,显示我生成的“结果” 这一切都是可行的,但问题是,当我的程序处理它从文本字段获取的数据时,我希望JButton更改它所说的内容,我已经尝试使用event.getSource().setText(),我发现它正在更改按钮文本

因此,我的代码基本上有一个带有一些文本字段的
JPanel
和一个
JButton
,当用户单击按钮时,它会转到按钮侦听器,然后按钮侦听器从文本字段获取数据并对其进行处理,创建
jlabel
,并将其添加到另一个不可见的
JPanel
。然后,我使第一个JPanel不可见,并使第二个面板可见,显示我生成的“结果”

这一切都是可行的,但问题是,当我的程序处理它从文本字段获取的数据时,我希望
JButton
更改它所说的内容,我已经尝试使用
event.getSource().setText()
,我发现它正在更改按钮文本(通过打印到控制台),但它不会用更改的文本更新按钮

在此之后,我尝试了所有形式的重新验证、重新喷漆和验证,但都没有成功。有什么想法吗?谢谢

//entryPanel is the first panel, and picksPanel is the second panel
button.addActionListener(new ActionListener()
                           {

  public void actionPerformed(ActionEvent event)
  {
    ((JButton)event.getSource()).setText("Thinking...");
    revalidate();
    repaint();
    try
    {    
      CriticPick picks = new CriticPick(cityfield.getText(),statefield.getText());
      LinkedList<Movie> pickslist = picks.getList();
      glayout.setRows(pickslist.size()+2+thepicks.movnum);
      picksPanel.add(new JLabel("The Results:"));

      //In my actual code I do a bunch of processing and looping that results in jlabels being added to picksPanel
      for (int i=0;i<pickslist.size();i++)
      {
          JLabel label = new JLabel(pickslist.get(i).title);
          picksPanel.add(label);
      }  
    }
    catch (Exception exc)
    {
      System.out.println(exc);
    }

    entryPanel.setVisible(false);
    picksPanel.setVisible(true);

  }});

  guiFrame.add(entryPanel);
  guiFrame.add(picksPanel);
  guiFrame.setLayout(new FlowLayout(FlowLayout.LEFT));
  guiFrame.setVisible(true);
}
//entryPanel是第一个面板,picksPanel是第二个面板
addActionListener(新建ActionListener())
{
已执行的公共无效操作(操作事件)
{
((JButton)event.getSource()).setText(“思考…”);
重新验证();
重新油漆();
尝试
{    
CriticPick picks=新的CriticPick(cityfield.getText(),statefield.getText());
LinkedList pickslist=picks.getList();
grayout.setRows(pickslist.size()+2+thepicks.movnum);
picksPanel.add(新JLabel(“结果:”);
//在我的实际代码中,我做了大量的处理和循环,结果jlabel被添加到picksPanel中

对于(int i=0;i,原因是在作业完成之前不会处理绘制事件,因此
setText
的效果不会在您认为会显示的时候显示

repaint()
只承诺“尽快”(根据文档)重新绘制,但由于绘制事件与按钮单击事件在同一线程(“事件调度线程”)上处理,因此您的处理实际上会导致
setText
调用和面板隐藏/显示同时发生(可以说),工作完成后

如果您的作业占用了相当长的时间,那么使用数据处理作业阻塞EDT的效果是显而易见的-由于EDT没有任何机会重新绘制、处理调整大小/鼠标单击事件等,UI将变得完全无响应


繁重的处理应该在后台线程中完成,最好是通过
SwingWorker
的帮助。这样EDT就可以自由处理油漆(和其他)事件。

我希望您不要执行长时间运行的任务,这会阻止EDT进行必要的更新…为什么不在这种情况下使用,而不是使用
revalidate()/repaint()