2

したがって、私のコードには基本的にJPanelいくつかのテキストフィールドと がありJButton、ユーザーがボタンをクリックするとボタンリスナーに移動し、テキストフィールドからデータを取得して処理し、JLabels別の非表示に追加するものを作成しますJPanel。次に、最初の JPanel を非表示にし、2 番目のパネルを表示して、生成した「結果」を表示します。

これはすべて機能しますが、問題は、プログラムがテキストフィールドから取得したデータを処理しているときに、プログラムの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);
}
4

1 に答える 1

5

その理由は、ジョブが完了する前にペイント イベントが処理されないためですsetText

repaint()「できるだけ早く」(ドキュメントごとに)再描画することを約束するだけですが、描画イベントはボタンクリックイベントと同じスレッド(「イベントディスパッチスレッド」)で処理されるため、処理によりsetText呼び出しとパネルの非表示/表示が効果的に発生します仕事が終わった、同時に(いわば)起こること。

ジョブにかなりの時間がかかる場合、データ クランチ ジョブで EDT をブロックすることの影響は明らかです。EDT には再描画、サイズ変更/マウス クリック イベントの処理などの機会がないため、UI は完全に応答しなくなります。

負荷の高い処理はバックグラウンド スレッドで実行する必要がありSwingWorkerます。これにより、EDT は自由にペイント (およびその他の) イベントを処理できるようになります。

于 2013-08-26T07:46:27.493 に答える