JButton 文字没有改变

use*_*980 2 java user-interface swing jpanel jbutton

所以我的代码基本上有一个JPanel带有一些文本字段和一个JButton,当用户单击按钮时它会转到按钮侦听器,然后从文本字段中获取数据并处理它,创建JLabels它添加到另一个不可见的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);
}
Run Code Online (Sandbox Code Playgroud)

per*_*erp 5

原因是在您的工作完成之前没有处理任何绘制事件,因此setText不会在您认为会显示时显示效果。

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

如果您的工作需要花费大量时间,那么通过数据处理作业阻止 EDT 的效果是显而易见的 - UI 将变得完全无响应,因为 EDT 没有任何机会重新绘制、处理调整大小/鼠标单击事件等。

繁重的处理应该在后台线程中完成,最好借助SwingWorker. 这使 EDT 可以自由处理绘制(和其他)事件。