Java AWT/Swing : paintComponent issue with custom JPanel(s)

标签 java swing awt graphics2d

好的,基本上,到目前为止我所拥有的:

  • 创建自定义 JFrame (ApplicationWindow) 的主类。
  • 扩展 JFrame 并充当窗口的 ApplicationWindow 类。
  • 扩展 JPanel 的 MapDisplayPanel 类,旨在(使用 GridLayout)显示 8x8 网格:
  • 扩展 JPanel 的 MapBlock 类。
  • MapBlocks 包含在包含游戏数据的类 GameData.java 中

这一切似乎都有效,除了只有一个 MapBlock 被绘制到屏幕上。

代码:

Main.java

public class Main {

public static void main(String[] args) {
    final ApplicationWindow window = new ApplicationWindow();

    window.setVisible(true);
}
}

ApplicationWindow.java

public class ApplicationWindow extends JFrame {

public ApplicationWindow()
{
    setTitle("Heroes!");
    setLocationRelativeTo(null);
    setSize(800,600);
//  setLayout(new BorderLayout());

    JPanel map = new MapDisplayPanel();

    add(map);//, BorderLayout.CENTER);
}
}

MapDisplayPanel.java

public class MapDisplayPanel extends JPanel{
GameData game = null;

public MapDisplayPanel()
{
    game = new GameData();
    setLayout(new GridLayout(game.getWidth(),game.getHeight()));
    setBackground(Color.CYAN);

    MapBlock[][] map = game.getMap();
    for(MapBlock[] aBlk : map)
    {
        for(MapBlock blk : aBlk)
        {
            if(blk != null){add(blk);}
        }
    }
}
}

MapBlock.java

public class MapBlock extends JPanel{
private int xPos = -1, yPos = -1;

//Constructors
public MapBlock(int x, int y, int terrain)
{
    this.xPos = x;
    this.yPos = y;
    this.terrain = terrain;
    setPreferredSize(new Dimension(50,50));
}

//Methods
@Override
public void paintComponent(Graphics g)
{
    //setBackground(Color.GREEN);
    super.paintComponent(g);
    g.setColor(Color.GREEN);
    g.fillRect(0, 0, this.getWidth(), this.getHeight());
    g.setColor(Color.MAGENTA);
    g.fillRect(10, 10, this.getWidth() - 20, this.getHeight() - 20);

    /*String out = Integer.toString(this.getX()) + Integer.toString(this.getY());
    System.out.println(out); THIS WAS FOR DEBUG*/
}

//Accessors, mutators
public int getTerrain()
{return terrain;}

public int getX()
{return xPos;}
public int getY()
{return yPos;}

}

最后,GameData.java

public class GameData{

//Members
private MapBlock[][] map = null;
private int mapWidth = 8; private int mapHeight = 8;

//Constructors
public GameData()
{
    map = new MapBlock[mapWidth][mapHeight];
    for(int x = 0; x < mapWidth; x++)
    {
        for(int y = 0; y < mapHeight; y++)
        {
            map[x][y] = new MapBlock(x,y,1);
        }
    }
}

//Accessors, mutators
public MapBlock[][] getMap()
{return map;}

public int getWidth()
{return mapWidth;}

public int getHeight()
{return mapHeight;}

}

正如我所说,问题是只有左上角的 MapBlock 对象被绘制到屏幕上。我已经测试了这个硬核,似乎所有组件都已正确添加,并且至少为每个组件调用了paintComponent。这是我的输出图片:

/image/x5fVR.jpg

请帮忙!!

最佳答案

您正在重写 MapBlock 中的 getXgetY,布局管理器正在使用它来定位组件的所有实例

public int getX() {
   return xPos;
}

public int getY() {
   return yPos;
}

删除它们或重命名这些方法。

关于Java AWT/Swing : paintComponent issue with custom JPanel(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16512944/

相关文章:

从 HTTPS 服务器运行的 Java Web Start 应用程序被 Java 安全性阻止

java - 如何解决文件名或路径的外部控制 (CWE ID 73)

java - 如何在 swing 组件(对于组合框)的类中两次使用 toString?

java - 如何知道通用路径是直线还是曲线?

java - Android SQLite -- 使用 whereArgs 背后的逻辑是什么

java - 文本编辑器分隔符行号重叠和长行标记

JavaFX : Why doesn't the setContent method of SwingNode with a JComponent parameter accept a JPanel?

java - 如何忽略 JFrame 不透明度?

java - 如何使用 AffineTransform 的翻译?

java - 如果流是使用Java中的某些字符串或字节数组对象组成的,是否需要关闭InputStream?