JPanel set Color() repetition 工作不正常还是我做错了什么?
JPanel setColor() repeatation is not working properly or am I doing something wrong?
所以我有这个方法,它接受一个 JFrame 和两个 JPanel 作为参数,并进行从一个 Jpanel 到另一个的 fadeout/fadein 转换。我所做的就是在参数的第一个 Jpanel 上添加一个新的 Jpanel,并在循环中不断更新其背景颜色,直到它从透明变为黑色。上半部分工作正常,直到下半部分我尝试 运行 一个 while 循环,它一直循环直到第二个 Jpanel 上的色调面板的背景颜色从黑色变为透明。它一直保持黑色。
对此有什么想法吗?我做错了什么?
public static void fadeShow(JFrame frame, JPanel panel1, JPanel panel2) {
new Thread(new Runnable() {
@Override
public void run() {
try {
JPanel tint = new JPanel();
tint.setOpaque(true);
tint.setBackground(new Color(0,0,0,0));
tint.setBounds(frame.getBounds().x+1, frame.getBounds().y, frame.getWidth(), frame.getHeight());
panel1.add(tint);
Thread.sleep(1500);
int i = 5;
while(i <= 255) {
tint.setBackground(new Color(0,0,0,i));
i+=25;
Thread.sleep(50);
}
panel1.setVisible(false);
tint.setVisible(false);
panel1.remove(tint);
tint = new JPanel();
tint.setOpaque(true);
tint.setBackground(new Color(0,0,0,255));
tint.setBounds(frame.getBounds().x+1, frame.getBounds().y, frame.getWidth(), frame.getHeight());
panel2.add(tint);
frame.add(panel2);
i = 250;
while(i > 0) {
tint.setBackground(new Color(0,0,0,i));
i-=25;
Thread.sleep(50);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
您的程序通过在后台线程内对 Swing gui 状态进行重大更改来违反 Swing 线程规则。这有冻结您的 GUI 或导致奇怪的视觉伪像的风险。而是使用 Swing Timer,因为这可以让您以间隔延迟进行重复调用,并保证这些调用都将在 Swing 事件线程上进行。
所以我有这个方法,它接受一个 JFrame 和两个 JPanel 作为参数,并进行从一个 Jpanel 到另一个的 fadeout/fadein 转换。我所做的就是在参数的第一个 Jpanel 上添加一个新的 Jpanel,并在循环中不断更新其背景颜色,直到它从透明变为黑色。上半部分工作正常,直到下半部分我尝试 运行 一个 while 循环,它一直循环直到第二个 Jpanel 上的色调面板的背景颜色从黑色变为透明。它一直保持黑色。
对此有什么想法吗?我做错了什么?
public static void fadeShow(JFrame frame, JPanel panel1, JPanel panel2) {
new Thread(new Runnable() {
@Override
public void run() {
try {
JPanel tint = new JPanel();
tint.setOpaque(true);
tint.setBackground(new Color(0,0,0,0));
tint.setBounds(frame.getBounds().x+1, frame.getBounds().y, frame.getWidth(), frame.getHeight());
panel1.add(tint);
Thread.sleep(1500);
int i = 5;
while(i <= 255) {
tint.setBackground(new Color(0,0,0,i));
i+=25;
Thread.sleep(50);
}
panel1.setVisible(false);
tint.setVisible(false);
panel1.remove(tint);
tint = new JPanel();
tint.setOpaque(true);
tint.setBackground(new Color(0,0,0,255));
tint.setBounds(frame.getBounds().x+1, frame.getBounds().y, frame.getWidth(), frame.getHeight());
panel2.add(tint);
frame.add(panel2);
i = 250;
while(i > 0) {
tint.setBackground(new Color(0,0,0,i));
i-=25;
Thread.sleep(50);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
您的程序通过在后台线程内对 Swing gui 状态进行重大更改来违反 Swing 线程规则。这有冻结您的 GUI 或导致奇怪的视觉伪像的风险。而是使用 Swing Timer,因为这可以让您以间隔延迟进行重复调用,并保证这些调用都将在 Swing 事件线程上进行。