我正在創建一個程序,在該程序中我可以繪製地圖併爲其添加不同的道路等。我計劃在一個jpanel上添加地圖地形,並在另一個jpanel上添加道路等。但我無法讓他們工作。我不知道如何將多個jpanel完全疊加在一起,並使它們都能夠繪製。多個JPanel完全相互排列
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. 多個全屏div互相之間
- 2. 多個viewmodel互相交互
- 3. 完全排序兩個列表
- 4. Bootstrap列在手機上互相排列
- 5. 使用CTE相互計算多個列
- 6. 相互列表中的多個進程
- 7. 相互排斥對
- 8. 輸出提示相互排列
- 9. 排序不完全相同的列表Python
- 10. 從JPanel完全刪除JLabel ... not setVisible(False)
- 11. 如何執行多個獨特集(列組合)是相互排斥的SQLite中?
- 12. 兩個相互排斥的UIViews戰略
- 13. 在python中使用多個不相互排斥的ifs
- 14. scrapy:當多個div完全相同時只提取一個div
- 15. 如何證明兩個字符串是相互排列的?
- 16. 什麼是兩個相互排斥的列中的R
- 17. Concurrecy:僅相互排斥?
- 18. 安排如下相互
- 19. 排序方式是一列與另一列的值完全相同
- 20. 如何定位旋轉的div以完全相互對齊
- 21. 幫助有相同排列的鍵互相覆蓋
- 22. 排列多個div並排
- 23. MySQL從多個結構上完全相同的表中選擇
- 24. 如何獲得ArrayList shuffle生成多個不完全相同的
- 25. 使用MVC填充多個完全相同的模型
- 26. opengl/pyopengl - 在多個視口渲染完全相同的幀?
- 27. 顯示與值完全相同的多個點分散HighCharts
- 28. 發現差不多兩個完全相同的HTML郵件
- 29. 兩個完全相同的git倉庫
- 30. 使兩個分支完全相同git
我相信你想[玻璃板(http://docs.oracle.com/javase/tutorial/uiswing/components /rootpane.html) – 2013-07-31 05:38:04
我也嘗試了玻璃窗格。但我似乎無法讓他們完美地工作。它仍然是一個相同的問題,只有最上面的層被識別,而不是其他人下面添加的 – user2632928
這個概率不應該被標記爲jlayer。這與同名的班級無關! – Toby