首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SwingUtilities.invokeLater()更新textfield

使用SwingUtilities.invokeLater()更新textfield
EN

Stack Overflow用户
提问于 2012-10-19 13:21:32
回答 4查看 2.4K关注 0票数 2

我的程序由一个简单的gui和一个扩展线程的类组成!

我正在尝试学习如何使用SwingUtilities.invokeLater()来使用它来更新GUI中的textfield,但是如何在不做静态操作的情况下到达gui中的textfield呢?到目前为止,我是走在正确的轨道上,还是做错了什么:)?

这是从扩展线程的名为的类中获取的,我想在这里使用更新用户界面

代码语言:javascript
复制
public void run(){
    while (socket.isConnected()) {

    if (input.hasNext()) {

        updateTextField();
    }

}
}

private void updateTextField() {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
  // here i want to update my textfield using txt.setText(input.nextLine());

        }
    });

}

更新(到目前为止,这是我的代码)获取一个空指针导出

代码语言:javascript
复制
public void run(){
    while (socket.isConnected()) {
            String x = input.next();
            System.out.println(x);
    mg.updateChat(x); // this is the line that gives me the nullexeption

    }
}

在我的GUI中

代码语言:javascript
复制
public void updateChat(final String input){
SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
    txtChat.setText(input); 
    }
}); 
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-19 13:27:36

可以通过在包含对invokeLater()的调用的方法中有一个最终局部变量来实现这一点。您可以从runnable对象中访问该变量。

例如:

代码语言:javascript
复制
public void run(){
  while (socket.isConnected()) {
    if (input.hasNext()) {
      String nextInput = input.next();
      myGui.updateTextField(nextInput);
    }
  }
}

在GUI类中:

代码语言:javascript
复制
public void updateTextField(final String nextInput) {
  SwingUtilities.invokeLater(
    new Runnable(){
      @Override
      public void run() {
        // assuming a private JTextField variable, myTextField
        myTextField.setText(nextInput);
      }
    }
  );
}
票数 2
EN

Stack Overflow用户

发布于 2012-10-19 13:26:39

textfields必须声明为Client类中的实例变量,或者如果它们是在另一个类中声明的,则必须可以从Client类访问它们。

您在正确的轨道上使用SwingUtilities.invokeLater(),只需更新invokeLaterRunnablerun()方法中的Text字段即可。

票数 1
EN

Stack Overflow用户

发布于 2012-10-19 14:52:16

关于你的NPE:

代码语言:javascript
复制
public void run() {
  while (socket.isConnected()) {
    String x = input.next();
    System.out.println(x);
    mg.updateChat(x); // this is the line that gives me the nullexeption
  }
}

这意味着mg必须为null,原因是您没有给这个变量一个对GUI的有效引用。要解决这个问题,您需要通过方法或构造函数参数传递对显示的GUI的引用。例如,如果通过构造函数,您可以:

代码语言:javascript
复制
public class MySocketConnector implements Runnable {
  private MainGui mg;

  public MySocketConnector(MainGui mg) {
    this.mg = mg;
  }

  @Override
  public void run() {
    while (socket.isConnected() {
      // ... etc...
    }
  }

  //...
}

编辑1

关于你的评论:

我将如何改变mg成为我现在的gui?我目前使用的代码如下:私有MainGui mg;

这只是声明了变量,但它没有初始化它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12975197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档