2013-03-02 3 views
1

나는 내가하려고하는 것을 성취하는 방법을 알아 내기 위해 여러 가지 자습서와 검색을 시도했습니다. 기본적으로 JLayeredPane 안에는 두 개의 JPanel이 있습니다. 하나는 내 게임의 드로잉 표면을위한 것이고 다른 하나는 일시 중지 메뉴와 같은 GUI를위한 것입니다. 투명 필름이있는 png 파일이있어서 사용자가 도망 칠 때 팝업창이 뜨는 GUI 패널의 배경이되고 싶습니다. 내가 무엇을하든 상관없이, 패널의 배경 (심지어 구성 요소로 만들려고 시도해도)은 항상 그 위에 그려진 png 파일과 함께 회색입니다.투명하게 그릴 수 없음 구성 요소 배경

다른 사람들이 다음과 같이 추천 한 내용을 시도했습니다.

setBackground(new Color(0,0,0,0)); 

setOpaque(false); 

이들 중 어느

도움 듯하고, 아마도 나는이 후 다른 뭔가를 실패하고있다. 나는 전통적으로 생성자 이후 또는 jpanel을 확장하는 클래스의 생성자 내에서 수행했습니다.

내가 한 패널이 모든 것을 나 자신을 그릴 예정하고있는 점에 거의 모르지만, 나는 차라리이 boxlayouts 같은 자바의 기능을 내장 사용하는 것 등

편집 추가 작업 예 :

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.DisplayMode; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Image; 
import java.awt.Point; 
import java.awt.Toolkit; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 


public class Example { 

private MyWindow gWindow; 

public static void main(String argv[]) { 
    Example g = new Example(); 

    g.gameLoop(); 
} 

public Example() { 
    gWindow = new MyWindow(); 

    // Initialize the keyboard listener 
    gWindow.frame().addKeyListener(new KeyListener() { 
     public void keyPressed(KeyEvent e) { 
      if(e.getKeyCode() == KeyEvent.VK_ESCAPE) // escape key, show menu 
      { 
       System.exit(0); 
      } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) {   
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 
     } 
    }); 
} 

public void gameLoop() { 
    long lastLoopTime = System.currentTimeMillis(); 
    while(true) { 
     // Used to calculate movement of sprites 
     long delta = System.currentTimeMillis() - lastLoopTime; 
     lastLoopTime = System.currentTimeMillis(); 

     // Clear the canvas 
     Graphics2D g = (Graphics2D) gWindow.getBufferStrategy().getDrawGraphics(); 
     g.setColor(Color.black); 
     g.fillRect(0,0,gWindow.frame().getWidth(), gWindow.frame().getHeight()); 

     // Clean up graphics and flip buffer 
     g.dispose(); 
     gWindow.getBufferStrategy().show(); 

     // Small delay before next cycle 
     try { Thread.sleep(10); } catch (Exception e) {} 
    } 
} 

public class MyWindow { 
    private JFrame frame; 
    private JLayeredPane container; 
    private MyPanel gui; 
    private JPanel surface; 

    private Canvas canvas; 

    private GraphicsDevice vc; 
    private Dimension dm; 

    BufferedImage menuImg = null; 
    BufferedImage menuImgHighlight = null; 
    BufferedImage gSettings = null; 
    Font font = null; 

    public MyWindow() { 
     frame = new JFrame("Jumper"); 

     vc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

     DisplayMode display = vc.getDisplayMode(); 
     dm = new Dimension(display.getWidth(), display.getHeight()); 

     container = new JLayeredPane();  
     gui = new MyPanel(); 
     gui.setLayout(new BoxLayout(gui, BoxLayout.Y_AXIS)); 
     surface = new JPanel(new BorderLayout(0,0)); 

     frame.add(container, BorderLayout.CENTER); 
     container.add(surface, new Integer(0), 0); 
     container.add(gui, new Integer(1), 0); 

     init_resources(); 

     canvas = new Canvas(); 
     surface.add(canvas);  

     gui.setBackground(new Color(0,0,0,0)); 
     gui.setVisible(true); 
     gui.setOpaque(false); 

     surface.setVisible(true); 

     setFullScreen(display); 

     frame.setResizable(false); 
     frame.setVisible(true); 
     frame.pack(); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     frame.addComponentListener(new ComponentAdapter() { 

      @Override 
      public void componentResized(ComponentEvent e) { 
       setScreen(new Dimension(frame.getWidth(), frame.getHeight())); 
       frame.repaint(); 
      } 
     }); 

     canvas.setIgnoreRepaint(true); 
     canvas.createBufferStrategy(2); 
     canvas.setFocusable(false); 
    } 

    public JFrame frame() { 
     return frame; 
    } 

    public BufferStrategy getBufferStrategy() { 
     return canvas.getBufferStrategy(); 
    } 

    public void setScreen(Dimension dim) { 
     int width = (int) dim.getWidth(); 
     int height = (int) dim.getHeight(); 
     this.dm = dim; 

     container.setPreferredSize(dm); 
     gui.setPreferredSize(dm); 
     surface.setPreferredSize(dm); 

     canvas.setBounds(0,0,width,height); 
     if(gSettings == null) { 
      gui.setBounds((int) ((dm.getWidth() - 200)/2), 
        (int) ((dm.getHeight() - 200)/2), 
        200, 
        200); 
     } 
     else { 
      gui.setBounds((int) ((dm.getWidth() - gSettings.getWidth())/2), 
        (int) ((dm.getHeight() - gSettings.getHeight())/2), 
        gSettings.getWidth(), 
        gSettings.getHeight()); 
     } 
     gui.setBackground(gSettings); 
     surface.setBounds(0,0,width,height); 
     container.setBounds(0,0,width,height); 
     frame.validate(); 
    } 

    public void setFullScreen(DisplayMode display) { 
     setScreen(Toolkit.getDefaultToolkit().getScreenSize()); 
     frame.setUndecorated(true); 
     vc.setFullScreenWindow(frame); 
     if(dm != null && vc.isDisplayChangeSupported()) { 
      try { 
       vc.setDisplayMode(display); 
      } 
      catch(Exception e) {} 
     } 
     frame.validate(); 
    } 

    private void init_resources() { 
     try { 
      gSettings = ImageIO.read(getClass().getResourceAsStream("/gui/settingsWindow.png")); 
     } 
     catch(Exception e) 
     { 
      System.out.print("Failed to load resources"); 
      System.out.println(); 
     }  
    } 

} 

public class MyPanel extends JPanel { 

    BufferedImage img = null; 
    public MyPanel() { 
     super(); 
     setOpaque(false); 
    } 

    public void setBackground(BufferedImage img) { 
     this.img = img; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if(img != null) { 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.drawImage(img, 0, 0, null); 
     } 
    } 
} 
} 
+0

아마도 setOpaque가 작동해야하므로 게시 및 예제가 필요합니다. – MadProgrammer

+0

try setBackground (new Color (128,128,128,128)); 이것은 50 %의 이미지 투명도를 제공합니까? 아니? 이미지를 알기 위해서는 알파 성분이 있어야합니다. – Java42

+0

여러 가지 조합을 시도했지만 현재 가지고있는 문제를 재현하지 못하는 것 같습니다. 어쩌면 당신은 문제를 보여주는 실행 가능한 예제를 게시 할 필요가 있습니다 – MadProgrammer

답변

0

내가 대신의 말에 super.paintComponent를 호출,이 테스트가 아닌 한은 .... 방법은, 시작시 호출하려고 페인트

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    if(img != null) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(img, 0, 0, null); 
    } 
} 

T 그는 이것에 대해 추론하여 paintComponent의 작업 중 하나가 그래픽 컨텍스트를 명확하게 표시하고 그 위에 칠할 준비가되었음을 나타냅니다. 이벤트가 투명한 경우, 이전에 그렸던 그래픽 컨텍스트를 지우거나 지워야합니다. 그래픽 컨텍스트는 공유 리소스입니다. 즉, 지정된 창 내의 모든 구성 요소가 동일한 그래픽 컨텍스트를 공유 할 수 있으므로 먼저 닦아 내지 않으면 조금 더러워집니다.)

믹싱에 문제가있을 수 있습니다 무겁고 가벼운 무게 구성 요소이지만 중량 구성 요소에 경량 구성 요소를 추가 할 때 문제가되지는 않지만 마음의 뒤쪽에 두는 것이 좋습니다 ...;)

JComponent은 투명합니다.)

+0

이 코드 변경 사항은 아무런 영향을 미치지 않았습니다. – lostdev

+0

@lostdev 여러 시나리오를 가지고 놀았지만 문제를 재현 할 수는 없습니다. 당신은 문제를 보여주는 실행 가능한 예제를 제공해야합니다. – MadProgrammer

+0

실습 예제를 추가했습니다. – lostdev

0

여기에 물리학을 적용 해보십시오 ... 보이는 흰색은 RGB 최대 값 조합입니다 ...당신은 최소로 RGB 값을 유지하는 경우3210 그것은 .. 당신이 그래서 이것은 당신을 도울 것입니다 방법을 아래에 구현하는

시도 ..

(your component).setOpaque(false); 
(your component).setContentAreaFilled(false); 
(your component).setBorderPainted(false); 

희망을 어두운 색상 (블랙)이 아닌 투명 하나를 제공 할 것입니다. ..

+0

이러한 메소드는 JComponent 또는 JPanel에는 존재하지 않습니다. – lostdev

+0

'JComponent'는 기본적으로 투명하고 OP는 이미 그것을 사용하고 있습니다;) – MadProgrammer

+0

@MadProgrammer 실습 예제를 추가했습니다. – lostdev

관련 문제