java - Java Swing JButton在悬停和离开时缓慢改变颜色
问题描述
我正在尝试对我的 JButton 进行特殊效果:悬停时逐渐更改其背景颜色,并在悬停离开时逐渐变回。我使用 Java Timer 并尝试了很多次。看来我只能做部分悬停,到底发生了什么?我应该如何解决它?任何帮助将不胜感激。谢谢。
b.addMouseListener(new java.awt.event.MouseAdapter() {
Timer timer;
public void mouseEntered(java.awt.event.MouseEvent evt) {
timer = new Timer();
TimerClass Tclass = new TimerClass(b,26,255,255,0,10);
timer.scheduleAtFixedRate(Tclass, 0, 30);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
timer.cancel();
timer = new Timer();
TimerClass Tclass = new TimerClass(b,26,255,255,100,-10);
timer.scheduleAtFixedRate(Tclass, 0, 30);
}
});
class TimerClass extends TimerTask {
JButton jbu;
int r,b,g, ic;
int p;
boolean gu;
TimerClass(JButton jb, int rr, int bb, int gg, int op, int ii) {
jbu=jb;
r=rr;b=bb;g=gg;
ic=ii;
p=op;
if(op==0){gu=true;}else{gu=false;}
}
@Override
public void run() {
jbu.setBackground(new Color(r,b,g,p));
if((p+ic<100)&&(p+ic>0)){
p+=ic;}else{cancel();}
}
}
解决方案
import java.awt.Color;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
public class TwoButton{
JFrame Frame;
JButton button1, button2;
public TwoButton() {
Frame = new JFrame("Nya");
button1 = new JButton("Nya");
button2 = new JButton("Nya");
button1.setBounds(200,200,100,30);
button2.setBounds(200,230,100,30);
button1.setBackground(Color.white);
button2.setBackground(Color.white);
button1.setBorder(null);
button2.setBorder(null);
button1.setFocusable(false);
button2.setFocusable(false);
button1.addMouseListener(new MouseAdapt(button1));
button2.addMouseListener(new MouseAdapt(button2));
Frame.add(button1);
Frame.add(button2);
Frame.setSize(500,500);
Frame.getContentPane().setBackground(Color.white);
Frame.setLayout(null);
Frame.setVisible(true);
}
public static void main(String[] args) {
new TwoButton();
}
}
class MouseAdapt extends java.awt.event.MouseAdapter {
Timer timer;
JButton b;
MouseAdapt(JButton jbutton) {
b=jbutton;
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
timer = new Timer();
TimerClass Tclass = new TimerClass(b,255,255,255,-10);
timer.scheduleAtFixedRate(Tclass, 0, 30);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
timer.cancel();
Color currentColor = b.getBackground();
timer = new Timer();
TimerClass Tclass = new TimerClass(b, 255, 255, currentColor.getBlue(), 10);
timer.scheduleAtFixedRate(Tclass, 0, 30);
}
}
class TimerClass extends TimerTask {
JButton jbu;
int r,b,g,increment;
TimerClass(JButton jb, int rr, int bb, int gg, int inc) {
jbu=jb;
r=rr;b=bb;g=gg;
increment = inc;
}
@Override
public void run() {
jbu.setBackground(new Color(r,b,g));
//* Color change
if ((g+increment>=102)&&(g+increment<=255)){
g+=increment;
} else {
cancel();
}
}
}
推荐阅读
- if-statement - x86汇编中条件语句的实现
- ruby-on-rails - 通过一系列控制器传递 Rails 请求?
- python - 将scrapy数据打印到csv
- r - 无法绘制逻辑回归图
- java - 启动应用程序时显示异常 - org.openqa.selenium.WebDriverException:
- php - 如何在 php 中调整 Jquery jtable 列宽?
- mysql - MySQL:连接三个表
- shell - 需要使用 Shell 根据 csv 中的特定列检查和更新行
- java - Java:接收三个数字(short、int、long),方法必须返回最大的数字
- c# - 从 C# 中的列表访问对象参数