2

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

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

代码

这取自扩展线程的名为 Client 的类,这是我想使用 SwingUtilities.invokeLater(Runnable) 更新我的 GUI 的地方

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());

        }
    });

}

更新(到目前为止,这是我的代码)获取空指针执行

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 中

public void updateChat(final String input){
SwingUtilities.invokeLater(new Runnable() {

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

4 回答 4

2

您可以通过在包含对invokeLater(). 您可以从可运行对象中访问该变量。

例如:

public void run(){
  while (socket.isConnected()) {
    if (input.hasNext()) {
      String nextInput = input.next();
      myGui.updateTextField(nextInput);
    }
  }
}

在您的 GUI 类中:

public void updateTextField(final String nextInput) {
  SwingUtilities.invokeLater(
    new Runnable(){
      @Override
      public void run() {
        // assuming a private JTextField variable, myTextField
        myTextField.setText(nextInput);
      }
    }
  );
}
于 2012-10-19T13:27:36.487 回答
1

文本字段必须在Client类中声明为实例变量,或者如果它们在另一个类中声明,它们必须可以从Client类中访问。

你在使用的正确轨道上,只需更新里面的方法里面SwingUtilities.invokeLater()的文本字段。run()RunnableinvokeLater

于 2012-10-19T13:26:39.053 回答
1

关于你的 NPE:

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必须为空,原因是您没有为该变量提供对 GUI 的有效引用。为了解决这个问题,您需要通过方法或构造函数参数传入对显示的 GUI 的引用。例如,如果通过构造函数,您可以执行以下操作:

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?我目前通过以下代码对其进行集成:private MainGui mg;

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

于 2012-10-19T14:52:16.213 回答
0

您可以做的一件事是String在您的类中有一个扩展Thread类的字段。并在内部run()方法将该字段设置为您在文本字段中想要的任何值。然后编写一个方法来返回您在内部设置的字符串run()并调用该方法来设置您的文本字段。

于 2012-10-19T13:26:49.770 回答