JPanel setColor()重复不正常或我做错了什么?

时间:2018-04-21 16:51:05

标签: java swing jpanel runnable

所以我有这个方法,它接受一个JFrame和两个JPanel作为参数,并使fadeout / fadein从一个Jpanel转换到另一个Jpanel。我所做的只是在参数的第一个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();




}

1 个答案:

答案 0 :(得分:2)

你的程序通过在后台线程中进行重要的Swing gui状态更改来摆脱Swing线程规则。这可能会冻结您的GUI或导致奇怪的视觉伪像。而是使用Swing Timer,因为这可以允许您以间隔延迟重复调用,并保证这些调用都将在Swing事件线程上进行。