2013-07-31 4 views
4

지도를 그리고 다른 도로를 추가 할 수있는 프로그램을 만들고 있습니다. 나는 하나의 jpanel에지도 지형을 추가하고 다른 하나 위에 도로 등을 추가 할 계획을 세웠습니다. 그러나 나는 그들을 일하게 할 수 없다. 나는 서로의 위에 완전히 여러 개의 jpanels을 추가하고 그들 모두를 그릴 수 있도록하는 방법을 모른다.여러개의 JPanels가 완전히 겹쳐져 있습니다.

+1

[유리 창]] (http://docs.oracle.com/javase/tutorial/uiswing/components /rootpane.html) –

+0

나는 유리 창도 시도했다. 하지만 나는 그들에게 완벽하게 작동하도록하는 것 같다. 여전히 최상위 레이어 만 인식되는 동일한 문제가 있습니다. – user2632928

+0

이 문제는 jlayer로 태그하면 안됩니다. 그것은 같은 이름의 클래스와 관련이 없습니다! – Toby

답변

3

JPanel을 투명하게 만들 계획입니까? setOpaque(false)으로 전화하면 패널이 배경 사각형에 범람하지 않습니다. 스태킹 창에 대한 유용한 정보가 the Swing tutorial입니다.

+0

하지만 JPanels를 프레임 위에 어떻게 추가해야합니까? – user2632928

5

이 문제의 기본 접근 방법은 JLayeredPane과 같은 것이고 GridBagLayout과 같은 것을 사용하는 것입니다.

JLayeredPane을 사용하면 다양한 레이어의 z- 깊이를보다 잘 제어 할 수 있으며 GridBagLayout을 사용하면 필요할 때 서로 구성 요소를 배치 할 수 있습니다.

OverlayoutLayout을 살펴볼 수도 있지만 사용하지는 않았지만 나는 말할 수 없습니다.

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class MapLayers { 

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

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

       MapPane mapPane = new MapPane(); 
       try { 
        mapPane.addLayer(new ImageLayer(ImageIO.read(new File("Ponie.png")), 360, 10)); 
        mapPane.addLayer(new ImageLayer(ImageIO.read(new File("Layer01.png")), 0, 0)); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

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

    public class ImageLayer extends JComponent { 

     private Image bg; 
     private int xOffset; 
     private int yOffset; 

     public ImageLayer(Image image, int x, int y) { 
      bg = image; 
      xOffset = x; 
      yOffset = y; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (bg != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.drawImage(bg, xOffset, yOffset, this); 
       g2d.dispose(); 
      } 
     } 

    } 

    public class MapPane extends JLayeredPane { 

     private BufferedImage bg; 

     public MapPane() { 
      try { 
       bg = ImageIO.read(new File("PirateMap.jpg")); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
      setLayout(new GridBagLayout()); 
     } 

     public void addLayer(JComponent layer) { 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.weightx = 1; 
      gbc.weighty = 1; 
      gbc.fill = GridBagConstraints.BOTH; 

      add(layer, gbc); 

     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (bg != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       int x = (getWidth() - bg.getWidth())/2; 
       int y = (getHeight()- bg.getHeight())/2; 
       g2d.drawImage(bg, x, y, this); 
       g2d.dispose(); 
      } 
     } 
    } 
} 

좀 더 자세한 내용은 How to use LayeredPanes에서 봐 내가 원하는 생각

관련 문제