2013-07-22 3 views
1

void paint (Graphics g) 메서드를 재정 의하여 JPanel에 부분적으로 투명한 이미지를 그리려면 어떻게해야합니까? 나는 이미지를로드하고 나서 ((Graphics2D)g).drawImage(...)을 사용하는 명백한 방법을 시도했지만 작동하지 않았고 인터넷이 나에게 많은 것을 말하지 않습니다.JPanel에 부분 투명한 PNG 그리기

답변

6

JLabel는이 일을 할 수 있지만, 패널/이미지와 다른 뭔가를하고 싶은 경우 paintComponent을 사용하고 Graphics#drawImage는 옵션입니다. 도심이 사용

...이 렌더링 할 수 있었다

enter image description here

...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.LinearGradientPaint; 
import java.awt.Point; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TransparentPNG { 

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

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

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

    public class TestPane extends JPanel { 

     private BufferedImage img; 

     public TestPane() { 
      try { 
       img = ImageIO.read(new File("Pony.png")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      LinearGradientPaint lgp = new LinearGradientPaint(
        new Point(0, 0), 
        new Point(0, getHeight()), 
        new float[]{0f, 1f}, 
        new Color[]{Color.GREEN, Color.YELLOW}); 
      g2d.setPaint(lgp); 
      g2d.fillRect(0, 0, getWidth(), getHeight()); 
      if (img != null) { 
       int x = (getWidth() - img.getWidth())/2; 
       int y = (getHeight() - img.getHeight())/2; 
       g2d.drawImage(img, x, y, this); 
      } 
      g2d.dispose(); 
     } 
    } 
} 

체크 아웃 How to use labelsenter image description herePerforming Custom Painting

+0

제 이미지 편집기 여야합니다. 나는 본질적으로 당신이 가진 것과 같은 개념을 사용하고 있으며, 내 이미지 중 하나에서 코드를 시험해 보았는데 똑같은 문제가 생겼다. – creXALBO

+0

이미지 중 하나를 게시 할 수 있습니까? – MadProgrammer