Повторение JPanel setColor () не работает должным образом или я делаю что-то неправильно?

Al Nafis спросил: 28 марта 2018 в 03:11 в: java

Итак, у меня есть этот метод, который принимает JFrame и два JPanels как аргументы, и делает переход fadeout / fadein из одного Jpanel в другой. Все, что я делаю, это добавить новый Jpanel на первом Jpanel на параметр и обновлять его цвет фона в цикле, пока он не станет черным от прозрачного. Первая половина работает нормально, пока не доходит до второй половины, где я пытаюсь запустить цикл while, где он продолжает цикл, пока цвет фона панели оттенков на 2-м 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 ответ

Есть решение
Hovercraft Full Of Eels ответил: 28 марта 2018 в 03:17

Ваша программа игнорирует правила потоков Swing, внося существенные изменения состояния графического интерфейса Swing из фонового потока. Это рискует заморозить ваш графический интерфейс или вызвать странные визуальные артефакты. Вместо этого используйте таймер Swing, поскольку это может позволить вам совершать повторные вызовы с интервальной задержкой и гарантировать, что все эти вызовы будут выполняться в потоке событий Swing.