2013-08-26 4 views
1

내 코드는 기본적으로 일부 텍스트 필드와 JButton이 포함 된 JPanel이며 사용자가 버튼을 클릭하면 버튼 수신기로 이동 한 다음 텍스트 필드의 데이터를 가져 와서 처리합니다 JLabels 다른 보이지 않는 JPanel에 추가합니다. 그런 다음 첫 번째 JPanel을 보이지 않게 만들고 두 번째 패널을 표시하여 내가 생성 한 "결과"를 나타냅니다.JButton 텍스트가 변경되지 않습니다

이 모든 문제는 내 프로그램이 텍스트 필드에서 가져온 데이터를 처리하는 동안 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); 
} 
+0

필요한 업데이트를 위해 EDT를 차단하는 장기 실행 작업을 수행하지 않기를 바랍니다 ... [CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card)을 사용하지 않는 이유는 무엇입니까? .html).이 시나리오에서는'revalidate()/repaint()'로 머리카락을 뽑지 않고? –

답변

4

그 이유는 작업이 완료되기 전에 어떤 페인트 이벤트가 처리되지, 그래서 당신이 그것을 생각하면 setText의 효과가 표시되지 것입니다.

repaint()은 "최대한 빨리"(문서별로) 다시 칠할 것을 약속하지만 페인트 이벤트는 버튼 클릭 이벤트 ("이벤트 발송 쓰레드")와 동일한 스레드에서 처리되므로 처리시 효과적으로 setText 호출 및 패널 숨기기/동시에 발생하는 것 (말하자면) 이후 작업이 완료됩니다.

작업에 상당한 시간이 걸리는 경우 데이터 처리 작업으로 EDT를 차단하는 효과가 분명합니다. EDT에는 다시 칠할 기회가 없기 때문에 UI가 완전히 응답하지 않게되고 크기 조정/마우스 클릭 이벤트가 처리됩니다 등

무거운 처리는 백그라운드 스레드에서 수행해야하며, SwingWorker을 사용하는 것이 더 바람직합니다. EDT는 페인트 (및 기타) 이벤트를 자유롭게 처리 할 수 ​​있습니다.

+0

+1 관련 정보, EDT 막힘 :-) –

관련 문제