지도를 그리고 다른 도로를 추가 할 수있는 프로그램을 만들고 있습니다. 나는 하나의 jpanel에지도 지형을 추가하고 다른 하나 위에 도로 등을 추가 할 계획을 세웠습니다. 그러나 나는 그들을 일하게 할 수 없다. 나는 서로의 위에 완전히 여러 개의 jpanels을 추가하고 그들 모두를 그릴 수 있도록하는 방법을 모른다.여러개의 JPanels가 완전히 겹쳐져 있습니다.
4
A
답변
3
JPanel
을 투명하게 만들 계획입니까? setOpaque(false)
으로 전화하면 패널이 배경 사각형에 범람하지 않습니다. 스태킹 창에 대한 유용한 정보가 the Swing tutorial입니다.
+0
하지만 JPanels를 프레임 위에 어떻게 추가해야합니까? – user2632928
5
이 문제의 기본 접근 방법은 JLayeredPane
과 같은 것이고 GridBagLayout
과 같은 것을 사용하는 것입니다.
JLayeredPane
을 사용하면 다양한 레이어의 z- 깊이를보다 잘 제어 할 수 있으며 GridBagLayout
을 사용하면 필요할 때 서로 구성 요소를 배치 할 수 있습니다.
OverlayoutLayout
을 살펴볼 수도 있지만 사용하지는 않았지만 나는 말할 수 없습니다.
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에서 봐 내가 원하는 생각
[유리 창]] (http://docs.oracle.com/javase/tutorial/uiswing/components /rootpane.html) –
나는 유리 창도 시도했다. 하지만 나는 그들에게 완벽하게 작동하도록하는 것 같다. 여전히 최상위 레이어 만 인식되는 동일한 문제가 있습니다. – user2632928
이 문제는 jlayer로 태그하면 안됩니다. 그것은 같은 이름의 클래스와 관련이 없습니다! – Toby