【问题标题】:Painting Graphics2D in a JFrame在 JFrame 中绘制 Graphics2D
【发布时间】:2011-06-07 03:57:46
【问题描述】:

我正在制作一款 2D 垂直射击游戏,其中除了图形之外的所有内容都已编码(并且可以正常工作)。我以前没有使用过 Graphics 类,所以这对我来说是全新的。以下是我用来将所有内容绘制到 JFrame 的代码:

public void paintAll()
{
    Graphics h = new Graphics2D();
    for(Bullet j : GameState.getEnBullets()){
        h.drawImage(j.getImage(),j.getX(), j.getY(), null);}
    for(Enemy j : GameState.getEnemies()){
        h.drawImage(j.getImage(),j.getX(), j.getY(), null);}
    for(Bullet j : GameState.getPlayBullets()){
        h.drawImage(j.getImage(),j.getX(), j.getY(), null);}
    this.paint(h);
}

第一行“图形 h = new Graphics2D();”产生错误,因为 Graphics2d 是抽象的,但我不知道从哪里开始。

我需要代码来获取我拥有的所有图像并将它们绘制到 JFrame 中的点。我提醒您,我以前从未这样做过,所以请告诉我这样做是否是错误的方法。

【问题讨论】:

  • 与其对JFrame 本身进行自定义绘制,不如添加JComponentJPanel(如果要包含其他组件)。就在您认为在顶级容器中绘制最好的时候,您意识到您希望在全屏JWindow,或JDialog,或JInternalFrame,或CENTER 中进行渲染BorderLayout 在另一个 JPanel 中,或者..

标签: java swing graphics jframe paintcomponent


【解决方案1】:

改写paintComponent();它将提供Graphics 上下文。您可以将cast 发送到Graphics2D

Graphics2D g2d = (Graphics2D) g;

附录:假设您在 JComponent 中覆盖 paintComponent(),然后将其添加到 JFrame

【讨论】:

  • 不是调用paint(),而是看看这个example如何在Timer的actionPerformed()方法中使用repaint()
  • @Andrew Thompson:实际上他是部分正确的。他所说的对paintComponent(Graphics g) 有效,这很可能是他想说的。
  • 只是upvote,这个论坛上的一些帖子有大量关于此的信息,但你在原帖中是对的,在第一次之前。修正,对于 JFrame (RootPane) 只有paint() +1
【解决方案2】:

与 Will 的第二个线程(我的直升机视图)关于同一件事 Error with timer and JFrame

然后通过 Andrew Thompson 的魔法球来正确直觉

我添加了(我希望这是正确的,因为我不熟悉paint、paintComponent 或paintComponents 以及自定义图形)

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class MinimumSize extends JFrame {

    private static final long serialVersionUID = 1L;

    public MinimumSize() {
        setTitle("Custom Component Test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void display() {
        add(new CustomComponent());
        pack();        
        setMinimumSize(getSize());// enforces the minimum size of both frame and component
        setVisible(true);
    }

    public static void main(String[] args) {
        MinimumSize main = new MinimumSize();
        main.display();
    }
}

class CustomComponent extends JComponent {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(100, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 300);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

【讨论】:

  • 扩展JComponent 和覆盖paintComponent() 的好例子。此级别没有 UI 委托,但有 双缓冲区支持。顺便说一句,以前投票赞成。
猜你喜欢
  • 2021-11-24
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多