지도를 그리고 다른 도로를 추가 할 수있는 프로그램을 만들고 있습니다. 나는 하나의 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에서 봐 내가 원하는 생각
관련 문제
- 1. jpanels가 보이는 딜레마가 있습니다.
- 2. 이미지가 투명하게 겹쳐져 있습니다.
- 3. 브라우저에 브라우저가 겹쳐져 있습니다.
- 4. 이미지가 서로 겹쳐져 있습니다
- 5. 조각 콘텐츠가 겹쳐져 있습니다.
- 6. 내 조각이 겹쳐져 있습니다.
- 7. 제스처 인식기가 겹쳐져 있습니다.
- 8. 이미지가 네비게이션 막대에 겹쳐져 있습니다.
- 9. 각 끈이 옆으로 겹쳐져 있습니다
- 10. 배경 뒤에 스프라이트가 겹쳐져 있습니다.
- 11. tkinter 버튼이 라벨에 겹쳐져 있습니다.
- 12. CSS 유체 요소가 서로 겹쳐져 있습니다
- 13. 팝업의 플롯 그래프에 축 레이블이 겹쳐져 있습니다.
- 14. 안드로이드 : ListView는 그 아래의 뷰로 겹쳐져 있습니다
- 15. CoordinatorLayout 내부의 뷰가 시스템 버튼으로 겹쳐져 있습니다.
- 16. 안드로이드의 버튼이 겹쳐져 있습니다. 수정이 필요합니다
- 17. 동일한 라인의 이미지에 투명 그림자가 겹쳐져 있습니다.
- 18. 두 개의 ListBox가 겹쳐져 있습니다. 선택 문제
- 19. modalpopupextendar가 youtube에 의해 겹쳐져 있습니다. iframe
- 20. Xcode6 : 네비게이션 바가 아이폰 위에 겹쳐져 있습니다.
- 21. 왜 JPanels가 겹쳐 있습니까?
- 22. 왜 Jpanels가 작동하지 않습니까?
- 23. select 검색어에 여러개의 select case가 있습니다
- 24. 프레임에 Java JPanels가 표시되지 않음
- 25. JPanels가 Eclipse IDE에 표시되지 않습니까?
- 26. 두 개의 JPanels가 겹치고 있습니까?
- 27. 펄하여 여러개의 ALRM 신호
- 28. ActionBar가 겹쳐져 있는지 알아보기
- 29. 플로팅 div는 겹쳐져 있습니까?
- 30. 텍스처가 겹쳐져 있는지 확인
[유리 창]] (http://docs.oracle.com/javase/tutorial/uiswing/components /rootpane.html) –
나는 유리 창도 시도했다. 하지만 나는 그들에게 완벽하게 작동하도록하는 것 같다. 여전히 최상위 레이어 만 인식되는 동일한 문제가 있습니다. – user2632928
이 문제는 jlayer로 태그하면 안됩니다. 그것은 같은 이름의 클래스와 관련이 없습니다! – Toby