2017-11-15 6 views
1

을 연 후 JDialog를에 JTextArea에 텍스트를 설정할 수 없습니다 나는 마지막 열이있는 ActionListener 인 JButton를하는 JTable가 있습니다자바 스윙 : 그것은

private class EventDetailActionListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final long seqEventSel = tblModelEvents.getEventSeq(tblEvents.getSelectedRow()); 
       final String eventDetail = tblModelEvents.getEventDetail(tblEvents.getSelectedRow()); 
       new DialogEventDetail(seqEventSel).setDetailText(eventDetail); 
      } 
     }); 
    } 
} 

및 JDialog를위한 클래스입니다 :

public class DialogEventDetail extends JDialog { 
    private JTextArea txtAreaDetail; 

    public DialogEventDetail(JFrame parent) { 
     /* Building JDialog with its size and a BorderLayout 
     with a JScrollPanel at CENTER containing a 
     txtAreaDetail */ 
     this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     this.setVisible(true); 
    } 

    public void setDetailText(String text) { 
     this.txtAreaDetail.setText(text); 
    } 
} 

이 JDialog는, TableModel에 보관 유지되고있어 JTable가로드 될 때 즉시 보이지 않는 긴 XML 텍스트를 표시하기 위해서 사용됩니다. JTextArea는 사용자가 편집 할 수 없지만 JDialog가 표시된 후 항상 비어있는 이유를 이해할 수 없습니다. 내부에 텍스트가 없습니다. 대신, 생성자 내에

this.txtAreaDetail.setText(text); 

을 호출하면 텍스트가 나타납니다. 이유가 무엇인가요?

+2

모달 대화 상자에서 setVisible을 호출하면 대화 상자가 삭제 될 때까지 UI가 차단되므로 생성자를 사용하는 것이 가장 좋은 방법이라고 생각하십시오. 그러나 현재 귀하의 대화 상자가 모달이 아니기 때문에 이런 일이 있어서는 안됩니다. – Ansharja

+1

방금 ​​발견했습니다! 예, JDialog는 모달입니다. 나는 그것을 언급하는 것을 잊었습니다. setDetailText() 내에서 setVisible() 메서드를 움직이는 것이 이제는 효과가있는 것 같습니다. –

답변

1

시도

this.txtAreaDetail.revalidate(); 
this.txtAreaDetail.repaint(); 

SwingWorker를 통해 EventQueue의를 사용하는 특별한 이유를 사용.

나는 이것을 답변으로 게시 할 수 없습니다.

+0

답변 해 주셔서 감사합니다. SwingWorker 대신에 EventQueue에 특별한 이유가 없습니다. 내 제품에서 일한 이전 개발자도 똑같이 사용 했으므로 사용했습니다. 어쨌든, 나는이 문제가 JDialog가 가시화 된 후에 그 메소드를 호출 한 사실과 관련이 있다는 것을 발견했다. setDetailText() 내에서 setVisible() 메서드를 움직이는 것이 이제는 효과가있는 것 같습니다. –

+0

컨테이너 (예 : JPanel)에서 구성 요소를 추가 또는 제거한 후에 만 ​​JTextArea에 텍스트를 표시 할 필요가 없으며 구성 요소가 아니라 컨테이너에서 호출됩니다. –

+0

다른 말로하면, JTextArea는 결코 컨테이너로 사용되지 않으므로,이 메소드 호출을 수행 할 이유가 없습니다. 이제까지. –