JFrame中的JPanel没有出现?



我目前正在开发2D游戏,所以我没有使用布局管理器:

主.java

public class Main {
static JFrame mainframe = new JFrame();
private static JPanel pchar;
public static void main(String[] args) {
mainframe.getContentPane().setBackground(Color.DARK_GRAY);
mainframe.setLayout(null);
pchar = Characters.basiccharacter();
}
}

我设计了自己的 JPanel,因为我还没有找到一种简单的方法来绘制每个像素的组件(Area 也是我的类之一):

像素面板.java

public class PixelPanel extends JPanel {
private BufferedImage img;
private int scale;
public PixelPanel(Dimension d, int scale) {
this.setLayout(null);
img = new BufferedImage(d.width * scale, d.height * scale, BufferedImage.TYPE_INT_ARGB);
this.scale = scale;
drawImage();
}
// this will draw the pixel(s) according to the set scale
public void drawPixel(int x, int y, int rgb) {
drawArea(new Area(x * scale, (x + 1) * scale, y, (y + 1) * scale), rgb);
}
public void drawArea(Area a, int rgb) {
for(int x = a.x1(); x < a.x2(); x++) {
for(int y = a.y1(); y < a.y2(); y++) {
drawTruePixel(x, y, rgb);
}
}
drawImage();
}
// this will only draw the one pixel at x : y
private void drawTruePixel(int x, int y, int rgb) {
img.setRGB(x, y, rgb);
}
private void drawImage() {
this.paintComponent(img.getGraphics());
}
}

现在我试图制作一些资产

人物.java

public class Characters {
static int w = 10;
static int h = 12;
static int scale = 4;
public static JPanel basiccharacter() {
PixelPanel pchar = new PixelPanel(new Dimension(w, h), scale);
pchar.drawPixel(1, 2, 000);
// drawing some more pixels
return pchar;
}
}

并将它们放在我的游戏中:

主.java

mainframe.add(pchar);

但是,JFrame是深灰色的,但PixelPanel没有显示...

你有几个问题:

  1. 你永远不会在 Swing 组件上使用 getGraphics() 和 paintComponent()。Swing 将确定何时需要绘制组件,并将正确的图形对象传递给绘制方法。您所能做的就是建议使用 repaint() 方法重新绘制组件。

  2. 组件的大小为 (0, 0),因此无需绘制任何内容。

要解决这些问题,您需要重新设计代码。你需要更好地了解绘画的基础知识。 我建议您首先阅读自定义绘画的 Swing 教程中的部分,以获取更多信息和工作示例以开始使用。

一旦您更好地了解了自定义绘画的工作原理,您就可以决定要使用两种方法中的哪一种。

您可以使用BufferedImage创建自定义"角色"以添加到游戏中。您只需要一个图像来表示每个唯一字符。下一步是决定你想对你的角色做什么。也就是说,您需要在面板上绘制您的角色。所以问题是你想怎么做?

您可以:

使用BufferedImage创建ImageIcon,然后将ImageIcon添加到JLabel并将标签添加到面板。使用此方法,您需要管理标签的大小/位置。大小将是标签的首选大小,位置将根据游戏规则而变化。

此方法利用了使用 Swing 组件的优势,您只需提供要绘制的图像。您可以根据需要创建任意数量的JLabels,使用相同或不同的图像来代表您的角色。

或者你可以:

手动管理面板上特定位置的角色绘画。您需要重写面板的paintComponent(...)方法才能绘制每个角色对象。

使用这种方法,您将保留要绘制的对象的 ArrayList。此对象将包含至少两条数据:

  1. 要绘制的对象(即您的缓冲图像)
  2. 对象在面板上的位置。

然后,paintComponent()方法中的逻辑只是遍历 ArrayList 并绘制每个对象。因此,您显然还需要一种允许您将字符对象添加到 ArrayList 的方法。

您可以查看自定义绘制方法中找到的Draw On Component示例以获取此方法的示例。

最新更新