我的程序由一个简单的gui和一个扩展线程的类组成!
我正在尝试学习如何使用SwingUtilities.invokeLater()来使用它来更新GUI中的textfield,但是如何在不做静态操作的情况下到达gui中的textfield呢?到目前为止,我是走在正确的轨道上,还是做错了什么:)?
码
这是从扩展线程的名为的类中获取的,我想在这里使用更新用户界面
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);
}
});
}发布于 2012-10-19 13:27:36
可以通过在包含对invokeLater()的调用的方法中有一个最终局部变量来实现这一点。您可以从runnable对象中访问该变量。
例如:
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-19 13:26:39
textfields必须声明为Client类中的实例变量,或者如果它们是在另一个类中声明的,则必须可以从Client类访问它们。
您在正确的轨道上使用SwingUtilities.invokeLater(),只需更新invokeLater中Runnable的run()方法中的Text字段即可。
发布于 2012-10-19 14:52:16
关于你的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必须为null,原因是您没有给这个变量一个对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?我目前使用的代码如下:私有MainGui mg;
这只是声明了变量,但它没有初始化它。
https://stackoverflow.com/questions/12975197
复制相似问题