GUI上没有显示SwingUtilities.invokeLater(new Runnable()

时间:2015-02-20 20:32:19

标签: java

我的申请有问题。我的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();
            }
        }); 
    }
}

1 个答案:

答案 0 :(得分:1)

GetMeasage阻止事件调度线程,阻止它处理事件队列中的新事件,包括绘制请求

不要在阻止或长时间运行的事件调度线程中执行任何操作。相反,请考虑使用SwingWorkwr,特别是如果您需要能够更新UI以响应后台线程导致的某些更改

有关详细信息,请参阅Currency in Swing