JFrame中的JPanel没有显示出来?

时间:2018-04-18 16:32:49

标签: java swing jframe

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

  

Main.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也是我的类之一):

  

PixelPanel.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());
    }
}

现在我正在尝试制作一些资产

  

Characters.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;
    }
}

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

  

Main.java

mainframe.add(pchar);

然而,JFrame是深灰色,但PixelPanel没有出现......

1 个答案:

答案 0 :(得分:0)

你有几个问题:

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

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

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

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

    您可以使用BufferedImage创建自定义&#34;字符&#34;添加到您的游戏中。您只需要一个图像来表示每个唯一字符。下一步是决定你想要对角色做什么。那就是你需要在面板上画出你的角色。那么问题是你想如何做到这一点?

    你可以:

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

    这种方法利用了Swing组件,你只需要提供绘画的图像。您可以根据需要创建任意数量的JLabel,使用相同或不同的图像来表示您的角色。

    或者你可以:

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

    使用这种方法,您可以保留要绘制的对象的ArrayList。该对象至少包含两个数据:

    1. 要绘制的对象(即你的BufferedImage)
    2. 面板上对象的位置。
    3. 然后paintComponent()方法中的逻辑简单地遍历ArrayList并绘制每个对象。所以你显然还需要一个允许你将角色对象添加到ArrayList的方法。

      您可以查看Custom Painting Approaches中的Draw On Component示例,了解此方法的示例。