【问题标题】:JTextField loadingJTextField 加载
【发布时间】:2011-12-20 11:08:50
【问题描述】:

我有问题.. 在我的代码中,我有它,以便文本应该输出到 JTextField。当我运行程序时,它没有。但是,如果我在将文本放入 JTextField 的代码之后直接放置一个 JOptionPane,那么它可以工作......

任何人有一个解决方案来更新 JTextField 而无需 JOptionPane 之后?

我的代码:

// Works:
JTextField.setText("String");
JOptionPane.showMessageDialog(null, "String");

// Doesn't Work:
JTextField.setText("String");
//JOptionPane.showMessageDialog(null, "String");

【问题讨论】:

  • 给出的例子太模糊,无法开始。您是否在您启动的某个线程的上下文中设置文本?
  • 您的代码中有一个错误,您没有向我们展示。我想知道您是否可能遇到并发问题,就好像您试图通过调用 Thread.sleep() 在循环中重复更新 JTextField 一样,这就是它没有显示的原因,但这只不过是一个 SWAG,直到您告诉我们需要知道的细节。
  • 我没有使用任何线程...但也许我拥有的框架可以...
  • 这里只能猜测。如果您在正确提出问题时遇到问题,可以在这里找到帮助:sscce.org。

标签: java swing jpanel jtextfield joptionpane


【解决方案1】:

这可能失败的原因有两个:

  1. 您正在从主 (Swing) 线程外部调用 setText()
  2. 您在主(Swing)线程中调用setText()

在第一种情况下,将调用包装在 SwingUtilities.invokeLater() 中。

在后一种情况下,您设置了文本,但阻塞了 Swing 线程,因此无法呈现更改。您需要创建一个后台工作人员来完成这项工作并使用SwingUtilities.invokeLater() 从工作线程更新文本字段。

[编辑]有关如何使用后台线程以及如何从那里更新 UI 的示例,请参阅 Swing 教程:http://download.oracle.com/javase/tutorial/uiswing/concurrency/interim.html

【讨论】:

  • 你的意思是这样吗?? javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { JTextField.setText("Connecting you to #TeamZeale as " + n + ", hang on it might take a while..."); } });
  • 只有在后台线程中完成所有工作时才有效。如果阻塞主线程,Swing 将永远无法处理事件,也不会发生渲染。 UI 也将显示为“冻结”。
  • @enjikaka:请不要再让我们猜测了。请向我们展示更多您的代码并解释更多您正在做的事情,因为我们中的许多人已经向您提出了要求。
  • 我试图做的是,当我在 njIRC.class 中运行函数 runBot() 时,它使用 Act.class 中名为 putInS(String n) 的函数来设置名为 JTextField 的文本Main.java 中的状态到我传入的字符串。
  • @enjikaka:这无关紧要。这段代码在哪个线程中执行?
【解决方案2】:

为什么不在文本更新后使用 repaint()?

如果我没记错的话,那应该解决文本未附加的问题。

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 2016-10-02
    • 1970-01-01
    • 2014-01-19
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多