【问题标题】:JLabel not displaying on JFrame but only on JOptionPaneJLabel 不在 JFrame 上显示,而仅在 JOptionPane 上显示
【发布时间】:2015-04-22 04:44:17
【问题描述】:

我收到一个缓冲图像作为 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)
    {

    }
  }
}

【问题讨论】:

    标签: java swing jframe jlabel joptionpane


    【解决方案1】:

    所有 Swing 组件只能有一个父组件,因此当您调用 JOptionPane.showMessageDialog(null,screen); 时,您将覆盖前一个父组件,并将您的 JLabelScreenMonitorServer 中删除。

    阅读here

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2019-07-08
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多