【问题标题】:Java Swing: cannot set JTextArea text in JDialog after it opensJava Swing:打开后无法在 JDialog 中设置 JTextArea 文本
【发布时间】:2017-11-15 11:22:31
【问题描述】:

我有一个 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 加载时不会立即对用户可见。 JTextArea 未启用用户编辑,但我不明白为什么 JDialog 出现后它总是为空。 里面没有文字显示。相反,如果我调用

this.txtAreaDetail.setText(text);

在构造函数中,文本出现。 为什么会这样?

【问题讨论】:

  • 考虑到在模态对话框上调用 setVisible 会阻塞 UI,直到对话框被释放,所以使用构造函数是最好的解决方案。但是目前你的对话框不是模态的,所以这不应该发生
  • 我刚刚发现了!是的,我的 JDialog 是模态的,我忘了提它。在 setDetailText() 中移动 setVisible() 方法现在似乎可以工作了。

标签: java swing jtextarea jdialog invokelater


【解决方案1】:

尝试使用

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

使用 EventQueue 而不是 SwingWorker 的任何特定原因。

因为我无法添加 cmets 将其发布为答案。

【讨论】:

  • 感谢您的回答。使用 EventQueue 而不是 SwingWorker 没有任何具体原因。我只是使用它,因为以前在我的产品中工作的开发人员也是这样做的。无论如何,我发现问题可能与我在 JDialog 变为可见后调用该方法的事实有关。在 setDetailText() 中移动 setVisible() 方法现在似乎可以工作了。
  • 这不是在 JTextArea 中显示文本所必需的,只有在容器(即 JPanel)中添加或删除组件之后,才会在容器上调用,而不是在组件上调用。
  • 换一种说法——因为JTextArea 从来没有被用作容器,所以从来没有 有理由对它进行这些方法调用。永远。
  • 感谢您的更新,在这种情况下,由于可见对话框阻止 EDT 调用 setDetailText(eventDetail),因此不会填充文本区域。是否有任何情况下我们将在 JTextArea 上使用重绘,我已经看过示例,所以很好奇。
  • 请给我一个不错的例子的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2011-09-15
  • 2014-03-30
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多