2012-11-02 97 views
2

你好我正在嘗試創建一個Java遊戲,並且需要爲我的標籤添加一些效果。我有以下問題如何將淡入/淡出效果添加到JLabel

  1. 如何將淡入/淡出效果添加到我的標籤。
  2. 我有一個JLabel,但我需要一個形狀,可能是矩形或雲形狀。我怎樣才能做到這一點?
+1

JLabel的是透明的 – mKorbel

+0

我看不到邊框它。也許背景顏色是相同的。我將檢查 –

+0

試試['AlphaTest'](http://stackoverflow.com/a/2234020/230513)或['FlashTest'](http://stackoverflow.com/a/2124507/230513)。 – trashgod

回答

10

您可以使用AlphaComposite更改組件的opactiy水平...

現在,有小聰明使用定時器,可以讓標籤淡入和淡出或者乾脆控制不透明度,請你......

enter image description here

public class TestFadeLabel { 

    public static void main(String[] args) { 
     new TestFadeLabel(); 
    } 

    public TestFadeLabel() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new MainPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MainPane extends JPanel { 

     private float direction = -0.05f; 
     private FadeLabel label = new FadeLabel(); 

     public MainPane() { 
      setLayout(new BorderLayout()); 
      JLabel background = new JLabel(); 
      background.setLayout(new GridBagLayout()); 
      try { 
       background.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/Storm.jpg")))); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      add(background); 

      label = new FadeLabel(); 
      background.add(label); 

      Timer timer = new Timer(100, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        float alpha = label.getAlpha(); 
        alpha += direction; 
        if (alpha < 0) { 
         alpha = 0; 
         direction = 0.05f; 
        } else if (alpha > 1) { 
         alpha = 1; 
         direction = -0.05f; 
        } 
        label.setAlpha(alpha); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 
    } 

    public class FadeLabel extends JLabel { 

     private float alpha; 
     private BufferedImage background; 

     public FadeLabel() { 
      try { 
       background = ImageIO.read(getClass().getResource("/Cloud.png")); 
      } catch (Exception e) { 
      } 
      setText("Hide and go seek"); 
      setHorizontalAlignment(CENTER); 
      setVerticalAlignment(CENTER); 
      setAlpha(1f); 
     } 

     public void setAlpha(float value) { 
      if (alpha != value) { 
       float old = alpha; 
       alpha = value; 
       firePropertyChange("alpha", old, alpha); 
       repaint(); 
      } 
     } 

     public float getAlpha() { 
      return alpha; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight()); 
     } 

     @Override 
     public void paint(Graphics g) { 
      // This is one of the few times I would directly override paint 
      // This makes sure that the entire paint chain is now using 
      // the alpha composite, including borders and child components 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getAlpha())); 
      super.paint(g2d); 
      g2d.dispose(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      // This is one of the few times that doing this before the super call 
      // will work... 
      if (background != null) { 
       int x = (getWidth() - background.getWidth())/2; 
       int y = (getHeight() - background.getHeight())/2; 
       g.drawImage(background, x, y, this); 
      } 
      super.paintComponent(g); 
     } 
    } 
} 
+0

+1個不錯的例子:-) – kleopatra