【问题标题】:How to paintComponent to display objects in Java?如何在 Java 中绘制组件以显示对象?
【发布时间】:2013-11-08 11:15:50
【问题描述】:

好的,所以我有一个 GameField 类、一个 GameObject 类和一个 Panel 类。 GameObject 类描述了一个对象,它具有 x 和 y 位置、宽度和高度以及 x 和 y 方向(它当前正在移动的方向)。 GameField 类有这些对象的几个不同实例,一些自己存储,一些存储在原始数组中。

Panel 类应该在屏幕上显示这些对象。我为此使用了JPanel。 但是,当谈到在屏幕上实际显示它们时,我有点迷茫。我需要实现一个名为paintComponent(Graphics graphics) 的函数,它接收一个Graphics 对象。

首先,我想在屏幕上显示所有对象,并设置它们的颜色。它们的大小、位置等在别处处理。如何使用这些属性将实际对象设置为具有大小、位置和方向?

我可能需要重写paintComponent函数来显示GameField中的所有对象。

如果你能帮我写一些代码,那就太好了。

【问题讨论】:

    标签: java graphics jpanel paint


    【解决方案1】:

    我不太清楚您所说的“它们的大小、位置等在其他地方处理”是什么意思。现在,让我们假设您大致具有以下结构(为清楚起见,省略了字段和其他方法):

    class GameObject {
    
         java.awt.Color     getColor() { ... }
         java.awt.Point     getPosition() { ... }
         java.awt.Point     getDirection() { ... }
         java.awt.Dimension getSize { ... }
    } 
    
    class GameField {
    
         List<GameObject> getGameObjects() { ... }
    }
    
    class Panel extends JPanel {
    
        private GameField getGameField() { ... }
    
        @Override
        public void paintComponent(Graphics g) {
            // this is where the GameObjects must be painted
        }
    }
    

    paintComponent 方法负责 Panel 类的屏幕表示。如果你覆盖它,你就赢得了它的责任。幸运的是,绘画——如果乏味的话——相当简单。您询问了该 Graphics 参数。很简单,它是由 Java 的魔力为您设置的,并为您提供了一个用于绘图的工具箱。

    首先,无论何时重新粉刷面板,您都希望有一个干净的状态。绘制后无法删除任何内容,但您可以轻松地以您选择的背景颜色绘制整个面板。

    g.setColor(Color.white); // everything that is now painted will be white
    g.fillRect(0, 0, getWidth(), getHeight()); // fills the entire area with the set color
    

    现在,对于您拥有的每个游戏对象,让我们在屏幕上以对象定义的颜色和大小放置矩形,其中心位于对象的位置。

    for (GameObject object : getGameField().getGameObjects()) {
        g.setColor(object.getColor());
        g.fillRect(object.getPosition().x - (object.getSize().x / 2), object.getPosition().y - object.getSize().y / 2, object.getSize().x, object.getSize().y);
    }
    

    fillRect 方法要求前两个参数是矩形的左上角。所以为了让它以对象的位置为中心,我们分别从 x 和 y 值的位置减去一半大小。现在,对于每个 GameObject,您在正确的位置拥有一个与对象颜色对应的直径正确的矩形。

    您应该阅读 java.awt.Graphics 上的 javadoc 以了解如何绘制其他东西,可能是图像精灵或方向线或其他东西。繁琐但可行。

    【讨论】:

    • 当然,您还需要一些机制来触发面板上的重绘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多