JLabel不在JFrame上显示,而只在JOptionPane上显示

时间:2015-02-20 13:26:31

标签: java swing jframe jlabel joptionpane

我收到一个缓冲的图像作为byte []但是当我更新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)
    {

    }
  }
}

2 个答案:

答案 0 :(得分:2)

所有Swing组件只能包含一个父组件,因此当您致电JOptionPane.showMessageDialog(null,screen);时,您将取消前一位父级,并JLabelScreenMonitorServer中删除。

阅读here

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

答案 1 :(得分:0)

我通过将无限循环放在另一个线程中来解决。 谢谢你的帮助。