Java Swing:打开JDialog后无法在JTextArea中设置文本

Java Swing:打开JDialog后无法在JTextArea中设置文本,java,swing,jtextarea,jdialog,invokelater,Java,Swing,Jtextarea,Jdialog,Invokelater,我有一个JTable,其中最后一列是一个JButton,其ActionListener是: private class EventDetailActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { EventQueue.invokeLater(new Runnable() { @Override

我有一个JTable,其中最后一列是一个JButton,其ActionListener是:

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用于显示一个长的XML文本,它由TableModel保存,但在JTable加载时,suer不能立即看到。 JTextArea不能被用户编辑,但我不明白为什么在JDialog出现后它总是空的。 里面没有显示文字。相反,如果我打电话

this.txtAreaDetail.setText(text);
在构造函数内部,将显示文本。 为什么会这样?

尝试使用

this.txtAreaDetail.revalidate();
this.txtAreaDetail.repaint();
在SwingWorker上使用EventQueue的任何特定原因


因为我无法添加将此作为答案的注释。

请考虑在模式对话框上调用setVisible会阻塞UI,直到对话框被释放,因此使用构造函数是最佳解决方案。然而,目前您的对话框不是模态的,所以这不应该发生。我刚刚发现!是的,我的JDialog是一个模态,我忘了提到它。在setDetailText()中移动setVisible()方法现在似乎可以工作了。谢谢您的回答。对于EventQueue而不是SwingWorker,没有任何特定的原因。我之所以使用它,是因为以前在我的产品中工作的开发人员也这么做了。无论如何,我发现这个问题可能与我在JDialog变得可见后调用该方法有关。在setDetailText()中移动setVisible()方法现在似乎可以工作了。在JTextArea中显示文本时,这从来都不是必需的,只有在添加或删除容器(即JPanel)中的组件后,才会对容器而不是组件进行调用。换句话说,由于JTextArea从未用作容器,没有理由对它进行这些方法调用。谢谢您的更新,在这种情况下,由于可见对话框阻止EDT调用setDetailText(eventDetail),文本区域未填充。我们是否会在JTextArea上使用重绘,我看过一些例子,所以我很好奇。请给我一个链接到一个合适的例子。