2013-07-31 16 views
4

我正在創建一個程序,在該程序中我可以繪製地圖併爲其添加不同的道路等。我計劃在一個jpanel上添加地圖地形,並在另一個jpanel上添加道路等。但我無法讓他們工作。我不知道如何將多個jpanel完全疊加在一起,並使它們都能夠繪製。多個JPanel完全相互排列

+1

我相信你想[玻璃板(http://docs.oracle.com/javase/tutorial/uiswing/components /rootpane.html) – 2013-07-31 05:38:04

+0

我也嘗試了玻璃窗格。但我似乎無法讓他們完美地工作。它仍然是一個相同的問題,只有最上面的層被識別,而不是其他人下面添加的 – user2632928

+0

這個概率不應該被標記爲jlayer。這與同名的班級無關! – Toby

回答

3

您是否打算讓JPanel爲透明?您可以撥打setOpaque(false),這將防止面板淹沒背景矩形。在the Swing tutorial中有關於堆疊窗格的一些有用信息。

+0

但我應該如何將JPanels添加到框架上? – user2632928

5

解決此問題的基本方法是使用JLayeredPaneGridBagLayout之類的東西。

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看看一些更多的細節