Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel setColor()重复工作不正常,或者我做错了什么?_Java_Swing_Jpanel_Runnable - Fatal编程技术网

Java JPanel setColor()重复工作不正常,或者我做错了什么?

Java JPanel setColor()重复工作不正常,或者我做错了什么?,java,swing,jpanel,runnable,Java,Swing,Jpanel,Runnable,所以我有一个方法,它使用一个JFrame和两个Jpanel作为参数,并从一个Jpanel到另一个Jpanel进行fadeout/fadein转换。我所做的就是在参数的第一个Jpanel上添加一个新的Jpanel,并在循环中不断更新其背景色,直到它从透明变为黑色。前半部分工作正常,直到下半部分,我尝试运行while循环,它一直循环,直到第二个Jpanel上的着色面板的背景色从黑色变为透明。它一直是黑色的 有什么想法吗?我做错了什么 public static void fadeShow(JFram

所以我有一个方法,它使用一个JFrame和两个Jpanel作为参数,并从一个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();




}
publicstaticvoidfadeshow(JFrame-frame,jpanelpanel1,jpanelpanel2){
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
JPanel tint=新的JPanel();
色调设置不透明(真);
色调背景(新颜色(0,0,0,0));
tint.setBounds(frame.getBounds().x+1,frame.getBounds().y,frame.getWidth(),frame.getHeight());
面板1.添加(色调);
睡眠(1500);
int i=5;
而(i 0){
退步底色(新颜色(0,0,0,i));
i-=25;
睡眠(50);
}
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}).start();
}

通过在后台线程中对Swing gui状态进行重大更改,您的程序可以无视Swing线程规则。这可能会冻结GUI或导致奇怪的视觉瑕疵。相反,请使用,因为这样可以使您以间隔延迟重复调用,并保证这些调用都将在Swing事件线程上进行。

其中一个原因是,您的代码运行时违反了Swing线程规则。用a代替。这不完全是你要问的,但也许这个帖子会给你一些想法。它显示了如何使用计时器更改颜色(而不是透明度)。