Java Swing прозрачная бесконечная загрузка/анимация загрузки мерцает

Я создал бесконечную прозрачную загрузку jframe, однако он мерцает при настройке фона на прозрачный с вызовом f.setBackground (новый цвет (0, 0, 0, 0)); если setBackground прокомментирован, JFrame правильно отображает анимированный значок.

Кто-нибудь может это исправить?

import java.awt.Color;
import java.awt.EventQueue;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class InfiniteLoad extends JPanel
{
    private JPanel loadingPanel() throws MalformedURLException
    {
        JPanel panel = new JPanel();
        BoxLayout layoutMgr = new BoxLayout(panel, BoxLayout.PAGE_AXIS);
        panel.setLayout(layoutMgr);

        java.net.URL imageURL = new URL("http://oi59.tinypic.com/106a6vo.jpg");
        ImageIcon imageIcon = new ImageIcon(imageURL);
        JLabel iconLabel = new JLabel();
        iconLabel.setIcon(imageIcon);
        imageIcon.setImageObserver(iconLabel);

        JLabel label = new JLabel("Loading...");
        panel.add(iconLabel);
        panel.add(label);
        panel.setOpaque(false);
        return panel;
    }

    public static void main(String[] args) throws MalformedURLException
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                JFrame f = new JFrame("Window");
                f.setUndecorated(true);

                //AWTUtilities.setWindowOpacity(f, 0.6f);
                //f.setOpacity(0.4f);

                InfiniteLoad imagePanel = new InfiniteLoad();
                JPanel jp = null;
                try
                {
                    jp = imagePanel.loadingPanel();
                }
                catch (MalformedURLException ex)
                {
                    Logger.getLogger(InfiniteLoad.class.getName()).log(Level.SEVERE, null, ex);
                }

                f.setContentPane(jp);
                f.setBackground(new Color(0, 0, 0, 0)); //<-- THIS CAUSES FLICKERING
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

ИЗМЕНИТЬ:

Хорошо, проблема была связана с OpenJDK Java, она отображала упомянутую проблему с

java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1~0.13.10.1)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

во время работы с

java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

показывает правильно. Если кто-нибудь может показать обходной путь, чтобы заставить его работать правильно даже в ошибочных реализациях, добро пожаловать.


person dendini    schedule 17.07.2014    source источник
comment
(мое любопытство) и есть ли такая же проблема при использовании недекорированного JButton   -  person mKorbel    schedule 17.07.2014
comment
извините, я не понимаю.. какая кнопка? У меня нет кнопок в моем коде   -  person dendini    schedule 17.07.2014
comment
Я просто запускал его 3 раза в 1.8.0_05(?) на Windows 7 и никакого мерцания не заметил, только анимированное изображение.   -  person Andrew Thompson    schedule 17.07.2014
comment
Хм интересно.. Запускал на Ubuntu, java версии 1.7.0_55 и мерцает, сейчас попробую на винде. Кажется, это связано с тем, что фон используется для имитации анимации, когда вместо этого он используется для скрытия старого изображения.   -  person dendini    schedule 17.07.2014
comment
У меня вроде нормально работает, а у вас какая ОС?   -  person MadProgrammer    schedule 17.07.2014
comment
@Andrew Thompson интересно, я ничего не видел, только описание Загрузка... работает с Win8/Java7   -  person mKorbel    schedule 17.07.2014
comment
Попробуйте добавить jp во фрейм вместо того, чтобы установить его в качестве панели содержимого...   -  person MadProgrammer    schedule 17.07.2014


Ответы (1)


извините, я не понимаю.. какая кнопка? У меня нет кнопок в моем коде

  • Я тестировал анимированные изображения всегда в недекорированном JButton (возможно, одна из моих вредных привычек)

  • не могу найти (не самое глубокое исследование) хорошее анимированное изображение, сохраненное в формате JPEG, которое работает (все прозрачно, ничего не видно из кода attn в моем посте, затем ничего не мерцает)

  • не может быть / не может быть проблемы с анимированным GIF

    введите здесь описание изображения

код

import com.sun.awt.AWTUtilities;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Insets;
import java.net.MalformedURLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
//http://stackoverflow.com/q/24797774/714968
public class InfiniteLoad extends JPanel {

    private JPanel loadingPanel() throws MalformedURLException {
        JPanel panel = new JPanel();
        BoxLayout layoutMgr = new BoxLayout(panel, BoxLayout.PAGE_AXIS);
        panel.setLayout(layoutMgr);
        ImageIcon imageIcon = new ImageIcon((getClass().getResource("/Images/smiley_018.gif")));
        JButton button = new JButton();
        button.setBorderPainted(false);
        button.setBorder(null);
        button.setFocusable(false);
        button.setMargin(new Insets(0, 0, 0, 0));
        button.setContentAreaFilled(false);
        button.setIcon(imageIcon);
        JLabel myLabel = new JLabel(imageIcon);
        JLabel label = new JLabel("Loading...", JLabel.CENTER);
        panel.add(button);
        panel.add(label);
        panel.add(myLabel);
        panel.setOpaque(false);
        return panel;
    }

    public static void main(String[] args) throws MalformedURLException {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame("Window");
                f.setUndecorated(true);
                //AWTUtilities.setWindowOpacity(f, 0.1f);
                //f.setOpacity(0.1f);
                InfiniteLoad imagePanel = new InfiniteLoad();
                JPanel jp = null;
                try {
                    jp = imagePanel.loadingPanel();
                } catch (MalformedURLException ex) {
                    Logger.getLogger(InfiniteLoad.class.getName()).log(Level.SEVERE, null, ex);
                }
                f.setContentPane(jp);
                f.setBackground(new Color(0, 0, 0, 0)); //<-- THIS CAUSES FLICKERING
                f.pack();
                f.setVisible(true);
            }
        });
    }
}
person mKorbel    schedule 17.07.2014
comment
Приведенный выше код мерцает в Ubuntu 13.10 x86_64 java версии 1.7.0_55. - person dendini; 17.07.2014
comment
@dendini Я думаю, что что-то с графическим процессором (надеюсь, это не работает с ноутбука) - person mKorbel; 17.07.2014
comment
Работа с ПК: VGA-совместимый контроллер: Advanced Micro Devices, Inc. [AMD/ATI] Pitcairn PRO [Radeon HD 7850] - person dendini; 17.07.2014