我的申请有问题。我的GUI中的标签应该更新并显示从服务器接收的消息。
从服务器发送消息到客户端工作正常。收到消息也正常。问题是在标签中显示消息。
更新标签我正在使用 SwingUtilities.invokeLater(new Runnable())。 GUI不显示全部,而不是我添加按钮或其他任何内容。但是,如果我删除行rec.getMessage();主要是GUI显示。
我错过了什么?
班级发件人:
public class Sender {
private String address = "225.200.200.200";
private int port = 10002;
String message = "";
public Sender(String msg) {
message = msg;
send();
}
public void send() {
MulticastSocket socket = null;
InetAddress group = null;
try {
group = InetAddress.getByName(address);
socket = new MulticastSocket();
socket.joinGroup(group);
socket.setTimeToLive(1);
}
catch (IOException e) {
System.err.println("Error" + e.getMessage());
System.exit(0);
}
while(true) {
try {
DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, group, port);
socket.send(packet);
}
catch (IOException e) {
System.err.println("Error" + e.getMessage());
}
}
public static void main(String[] args) {
new Sender("hello");
}
}
在接收器类中:
public class Receiver extends JFrame {
private String address = "225.200.200.200";
private int port = 10002;
private JLabel label;
public Receiver() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(320, 150);
setLocationRelativeTo(null);
label = new JLabel("Message");
expressionLabel.setHorizontalAlignment(JLabel.CENTER);
add(expressionLabel, BorderLayout.CENTER);
setVisible(true);
}
public void getMessage() {
MulticastSocket socket = null;
InetAddress group = null;
try {
group = InetAddress.getByName(address);
socket = new MulticastSocket(port);
socket.setSoTimeout(100000);
socket.joinGroup(group);
}
catch (IOException e) {
System.err.println("Error" + e.getMessage());
System.exit(0);
}
byte[] data = new byte[1024];
while (true) {
DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
String message = new String(data, 0, packet.getLength());
displayMessage(message);
}
try {
socket.leaveGroup(group);
socket.close();
}
catch (IOException iofel) {}
}
private void displayMessage(String message) {
System.out.println(message); //THIS MESSAGE SHOWS
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setText(message); //LABEL WON'T UPDATE
System.out.println(message); //THIS MESSAGE WON'T SHOW
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Receiver rec = new Receiver();
rec.getMessage();
}
});
}
}
答案 0 :(得分:1)
GetMeasage阻止事件调度线程,阻止它处理事件队列中的新事件,包括绘制请求
不要在阻止或长时间运行的事件调度线程中执行任何操作。相反,请考虑使用SwingWorkwr,特别是如果您需要能够更新UI以响应后台线程导致的某些更改
有关详细信息,请参阅Currency in Swing