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