如何在 updateUiChanged() 事件之前捕获

我的 Java Swing 应用程序使用 updateUiChanged() 在用户调整其 jFrame 大小后调整字体大小。但是当 jFrame 最小化然后最大化时会触发 updateUiChanged(),这会导致问题


我试图用以下方法捕获最小化和最大化事件,但它们根本不执行,或者它们在为时已晚的 updateUiChanged() 之后执行。


如何在 updateUiChanged() 之前捕获最小化和最大化 请参阅下面的 updateUiChanged 实现。谢谢


   private WindowListener wndMinMax;    


   wndMinMax = new WindowAdapter(){


        public void windowIconified(WindowEvent e){

            if(debug)debug("Window Iconfied!!");

            return;

        }

        public void windowDeiconified(WindowEvent e){

            if(debug)debug("Window DeIconfied!!");

            return;

        }


    };

    this.addWindowListener(wndMinMax); 



    addComponentListener(new ComponentAdapter()                     

    {                                                               

        public void componentResized(ComponentEvent e) //V.43

        {

            if (e.getSource() instanceof JFrame) //V.43

            {

                updateUiChanged((int) e.getComponent().getWidth(),

                        (int) e.getComponent().getHeight());        

            }

        }                                                           

    });


牛魔王的故事
浏览 156回答 1
1回答

三国纷争

您可以使用EventQueue.invokeLater来确保您的 updateUiChanged 调用发生在 WindowEvent 之后。您可以在私有实例字段中跟踪 WindowEvent 的发生,因此延迟的 ComponentListener 代码可以知道调整大小是否与 WindowEvent 配对:private boolean iconifyStateChanged;// ...wndMinMax = new WindowAdapter(){    public void windowIconified(WindowEvent e){        if(debug)debug("Window Iconfied!!");        iconifyStateChanged = true;    }    public void windowDeiconified(WindowEvent e){        if(debug)debug("Window DeIconfied!!");        iconifyStateChanged = true;    }};this.addWindowListener(wndMinMax); addComponentListener(new ComponentAdapter()                     {                                                                   public void componentResized(ComponentEvent e) //V.43    {        if (e.getSource() instanceof JFrame) //V.43        {            // This will run after any pending WindowEvents.            EventQueue.invokeLater(() -> {                if (!iconifyStateChanged)                {                    updateUiChanged(e.getComponent().getWidth(),                                    e.getComponent().getHeight()));                }                iconifyStateChanged = false;            });        }    }                                                           });(getWidth()和getHeight()已经返回 int 值,因此不需要强制转换为 int。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java