如何将JPanel添加到另一个具有图形的JPanel?

时间:2011-02-21 22:25:48

标签: java swing graphics jpanel

基本上我试图做的是将JPanel添加到另一个使用paintComponent()方法绘制图形的JPanel上。但是我试图添加的JPanel没有显示,因为它被JPanel w / Graphics覆盖了。

我怎样才能这样做,以便当我将JPanel添加到一个w / graphics时,它会在前面显示JPanel而不是被图形掩盖?

所有答案都表示赞赏! :)

如果你需要代码,请告诉我,我很乐意把它放在这里。

这里是代码:

package javavideogame;
public class Game extends JPanel implements ActionListener, Runnable
{

 public Game(MainCharacter character)
 {
     setLayout(null);
     setFocusable(true);

 }


 public void paintComponent(Graphics g)
 {
     super.paintComponent(g);
     g.drawImage(ground, 0, 0, this);
     g.drawImage(character.getImage(), character.getX(), character.getY(), this);
     g.setColor(Color.RED);
     g.drawRect(10, 10, character.getMaxHealth(), 10);
     g.fillRect(10, 10, character.getHealth(), 10);
     g.dispose();
 }

 public void getInventoryScreen()
 {
     Main.inv = new Inventory();
     Main.game.add(Main.inv);
 }
}

package javavideogame; public class Game extends JPanel implements ActionListener, Runnable { public Game(MainCharacter character) { setLayout(null); setFocusable(true); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(ground, 0, 0, this); g.drawImage(character.getImage(), character.getX(), character.getY(), this); g.setColor(Color.RED); g.drawRect(10, 10, character.getMaxHealth(), 10); g.fillRect(10, 10, character.getHealth(), 10); g.dispose(); } public void getInventoryScreen() { Main.inv = new Inventory(); Main.game.add(Main.inv); } }

这是我正在添加到Game JPanel的JPanel的代码

public class Inventory extends JPanel
{
     public Inventory()
     {
         setLayout(null);
         setSize(400, 300);
         setBackground(Color.BLACK);
         addKeyListener(this);
         setFocusable(true);
     }
}

2 个答案:

答案 0 :(得分:1)

通过覆盖paintComponent(...)方法完成自定义绘制。我的猜测是你要覆盖paint()方法。

Custom Painting的Swing教程中阅读本节。因为你要覆盖错误的方法,所以你最先绘制孩子,然后在顶部完成自定义绘画。

如果您需要更多帮助,请发布展示问题的SSCCE

答案 1 :(得分:0)

提醒一下:java.awt和javax.swing混合不好。当你在一个面板上绘制东西并尝试向其添加JPanel时,你一定会遇到问题。一个更好的解决方案是拥有2个不同的JPanel,一个用于图形,一个用于库存。

这样的事情:

JPanel mainPanel = new JPanel(); //will hold BOTH panels
JPanel gamePanel = new Game(myCharacter); //declare game panel
JPanel inventoryPanel = new Inventory(); //declare inventory panel

//set up some layout
mainPanel.setLayout(new GridLayout(2, 1));

//add the graphics panel, then add the inventory
mainPanel.add(gamePanel);
mainPanel.add(inventoryPanel);

这样可以避免摆动和摆动组件混乱,为您节省很多麻烦。