2017-11-15 15 views
1

を開いた後JDialogの中JTextAreaのテキストを設定することができない私は、最後の列がActionListenerのあるJButtonのあるJTableのを持っている:Javaのスイング:それは

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

はSwingWorkerのオーバーのEventQueueを使用して、任意の特定の理由

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

を使用してみてください。

私は答えとして投稿するコメントを追加できません。

+0

ありがとうございます。 SwingWorkerではなく、EventQueueに特別な理由はありません。私の製品で働いていた以前の開発者が同じことをしたからです。とにかく、私は、JDialogが可視化された後、そのメソッドを呼び出したという事実に問題が関連する可能性があることを発見しました。 setDetailText()内のsetVisible()メソッドを動かすようになりました。 –

+0

これは、コンテナ(JPanel)内のコンポーネントを追加または削除した後でのみ、JTextAreaにテキストを表示するために必要なことではなく、コンポーネントではなくコンテナで呼び出されます。 –

+0

別の言い方をすれば、JTextAreaは決してコンテナとして使用されないので、**これらのメソッド呼び出しを行う理由は決して**ありません。これまで –