Java JLabel不显示在JFrame上,但仅显示在JOptionPane上

Java JLabel不显示在JFrame上,但仅显示在JOptionPane上,java,swing,jframe,jlabel,joptionpane,Java,Swing,Jframe,Jlabel,Joptionpane,我正在接收一个作为字节[]的缓冲图像,但当我更新JLabel的图标时,JFrame上没有任何变化,甚至重新验证了JFrame和JLabel。 相反,当我尝试在JOptionPane中显示JLabel时,效果很好。 我不明白为什么。 代码如下: public class ScreenMonitorServer extends JFrame { private String botIPAddress; private ServerSocket serverSocket; private Socket

我正在接收一个作为字节[]的缓冲图像,但当我更新JLabel的图标时,JFrame上没有任何变化,甚至重新验证了JFrame和JLabel。 相反,当我尝试在JOptionPane中显示JLabel时,效果很好。 我不明白为什么。 代码如下:

public class ScreenMonitorServer extends JFrame
{
private String botIPAddress;
private ServerSocket serverSocket;
private Socket botSocket;
private JLabel screen;

public ScreenMonitorServer(String botIPAddress)
{
    super(botIPAddress+" - Screen Monitor");
    this.botIPAddress=botIPAddress; 
    setLayout(new FlowLayout());
    screen=new JLabel();
    add(screen);
    setVisible(true);
    try
    {
        serverSocket=new ServerSocket(54323);
        do
            botSocket=serverSocket.accept();
        while(!botSocket.getInetAddress().getHostAddress().equals(botIPAddress));
        ObjectInputStream ois=new ObjectInputStream(botSocket.getInputStream());
        while(true)
        {
            BufferedImage image;
            InputStream in=new ByteArrayInputStream((byte[])ois.readObject());
            BufferedImage bImageFromConvert=ImageIO.read(in);
            ImageIcon screenImage=new ImageIcon(bImageFromConvert);
            setSize(bImageFromConvert.getWidth(),bImageFromConvert.getHeight());
            screen.setIcon(screenImage); //black screen
            JOptionPane.showMessageDialog(null,screen);  //works fine
        }
    }   
    catch(IOException exc)
    {
        exc.printStackTrace();
    }
    catch(ClassNotFoundException exc)
    {

    }
  }
}

所有Swing组件只能有一个父组件,所以当您调用
JOptionPane.showMessageDialog(null,屏幕)时
您验证了以前的父项,并将您的
JLabel
ScreenMonitorServer
中删除

阅读


在这种情况下,您需要使用两个
JLabel
实例。

我通过将无限循环放在另一个线程中解决了这个问题。
感谢您的帮助。

我将JOptionPane用作测试,即使没有调用
JOptionPane.showMessageDialog(空,屏幕)它不起作用你有什么例外吗?您是否尝试调试。在
EDT
中调用
while(true)
也不是一个好主意,可能是在您的情况下,您阻止了
EDT
。您代码的这一部分也会在我脑海中敲响一些警钟:catch(ClassNotFoundException exc){}@alex2410未调用异常。我会尝试,但它似乎没有被阻止,因为我添加了一个println,并且在客户端发送字节[]时每秒都会被调用。我没有在该catch块中显示任何内容,因为我正在转换到字节[],我认为这不是问题所在。但是,我在该块中添加了一个printStackTrace,但没有捕获任何异常。