为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 2021-06-11 18:19:48
我的 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());                    }        }                                                               });
查看完整描述

1 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

您可以使用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。)


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信