繁体   English   中英

Java swing-通过Alpha SetBackground淡入组件,正确同步

[英]Java swing - fading in a component by alpha setBackground, correct synchronization

我正在为我的一个项目制作第一个GUI。 我做了第一页,登录。 现在,我有一个登录按钮,该按钮应在单击时告知控制器并传递用户名和密码,但是我还没有为此设计LoginButtonListener,只是单击即可。

现在,我将这个MouseListener命名为LoginButtonListener ,它实现了MouseListener ,这是我覆盖的mouseEntered方法,该方法应该在登录按钮中淡出:

@Override
public void mouseEntered(MouseEvent arg0) {
    Timer timer = new Timer();
    final LoginButtonListener b = this;
    timer.schedule(new TimerTask(){

        private int alpha = 0;

        @Override
        public void run() {
            alpha += 5;

            synchronized(b) {
                b.button.setBackground(new Color(255, 255, 255, alpha));
            }

            if (alpha >= 255) {
                this.cancel();
            }
        }
    }, 0, 50);
}

如您所见,由于我使用的计时器是java.util.Timer ,所以计时器同步b变量,计时器是一个自己的线程,因此我认为这里需要同步。

我是否正确同步了? 还是我在做什么是错的?

这是在mouseEntered发生的mouseEntered

img
(来源: gyazo.com

你做的不对。 切勿触摸消息分派器线程以外的其他线程的swing组件。

为此,将访问swing的代码放在SwingUtilities.invokeLater(Runnable)(或invokeAndWait)中。

您不需要(显式)同步来控制对摆动组件的访问,因为您实际上仅通过一个线程来使用它们。 其他线程只是注册到要使用GUI执行的某些队列(通过SwingUtilities完成)任务。

Swing是一个单线程环境,您有一个正确的主意,但是实现起来有些不正确。

实际上,您应该使用javax.swing.Timer而不是java.util.Timer ,它将在Event Dispatching Thread的上下文中提高它的滴答声,例如,可以安全地从内部更新UI组件。

public void mouseEntered(MouseEvent arg0) {
    javax.swing.Timer timer = new javax.swing.Timer(50, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            alpha += 5;
            if (alpha >= 255) {
                alpha = 255;
                ((javax.swing.Timer)evt.getSource()).stop();
            }

            b.button.setBackground(new Color(255, 255, 255, alpha));
        }
    });
}

看看如何 在Swing中 使用Swing计时器并发以了解更多详细信息

您还应该小心更改任何不透明组件的背景色的alpha ,Swing只知道如何绘制不透明或透明组件,而不能处理半透明组件。 要正确执行此操作,您需要接管背景绘画的控制...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM