2013-07-31 14 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 еще несколько деталей

 Смежные вопросы

  • Нет связанных вопросов^_^