[英]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
:
(来源: 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.