我收到一个缓冲的图像作为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)
{
}
}
}
答案 0 :(得分:2)
所有Swing组件只能包含一个父组件,因此当您致电JOptionPane.showMessageDialog(null,screen);
时,您将取消前一位父级,并JLabel
从ScreenMonitorServer
中删除。
阅读here。
在这种情况下,您需要使用两个JLabel
实例。
答案 1 :(得分:0)
我通过将无限循环放在另一个线程中来解决。 谢谢你的帮助。