2014-07-17 2 views
2

무한 투명로드 jframe을 만들었지 만 f.setBackground (new Color (0, 0, 0, 0));을 호출하여 Background를 투명하게 설정할 때 깜박입니다. 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); 
      } 
     }); 
    } 
} 

편집 : 올바르게

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) 

쇼 실행하는 동안

확인 문제는 오픈 JDK 자바 관련이 있었다, 그것은

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) 

에 언급 된 문제가 표시됩니다. 버그가있는 구현에서도 제대로 작동하도록 해결 방법을 제시 할 수 있다면 누구나 환영합니다.

+0

(호기심)와 같은 문제는 [장식을 가지지하는 JButton (http://stackoverflow.com/a/7944388/714968)를 사용하여 I – mKorbel

+0

죄송있다 이해가 안 돼 .. 어떤 버튼? 내 코드에 버튼이 없습니다 – dendini

+0

Windows 7에서 1.8.0_05 (?)로 3 번 실행했는데 깜박임이없고 애니메이션 이미지 만 나타납니다. –

답변

1

죄송합니다. 어떤 버튼입니까? 나는

  • 내가 장식을 가지지하는 JButton 항상 (나의 나쁜 습관 어쩌면 하나) 애니메이션 이미지를 테스트하고있어 내 코드에 아무런 버튼이 없다

  • 를 찾을 수 없습니다 (안 깊은 연구) 애니메이션 좋은 작동 JPEG로 저장 이미지 (모두 투명, 아무것도 내 게시물에 코드 담당자에서 볼 수없는, 다음 아무것도 깜박임)

  • /애니메이션 GIF와 문제가되지 않습니다 없을 수

    enter image description here

코드

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); 
      } 
     }); 
    } 
} 
+0

위 코드는 우분투 13.10 x86_64 자바 버전 "1.7.0_55"에서 깜박입니다. – dendini

+0

@dendini GPU가있는 것 같아요. (노트북에서 돌아가고 싶지 않다.) – mKorbel

+0

PC에서 실행 : VGA 호환 컨트롤러 : Advanced Micro Devices, Inc. [AMD/ATI] Pitcairn PRO [Radeon HD 7850] – dendini