Java 在JFrame中绘制图形2D

Java 在JFrame中绘制图形2D,java,swing,graphics,jframe,paintcomponent,Java,Swing,Graphics,Jframe,Paintcomponent,我正在制作一个2d垂直射击游戏,在这个游戏中,除了图形之外,所有的东西都被编码(并且工作)。我以前没有使用过图形类,所以这对我来说是全新的。以下是我用于将所有内容绘制到JFrame的代码: public void paintAll() { Graphics h = new Graphics2D(); for(Bullet j : GameState.getEnBullets()){ h.drawImage(j.getImage(),j.getX(), j.getY

我正在制作一个2d垂直射击游戏,在这个游戏中,除了图形之外,所有的东西都被编码(并且工作)。我以前没有使用过图形类,所以这对我来说是全新的。以下是我用于将所有内容绘制到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);
}
第一行“Graphics h=new Graphics2D();”产生了一个错误,因为Graphics2D是抽象的,但我不知道从这里可以走到哪里

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

替代;它将提供
图形
上下文。您可以将其添加到
图形2D

Graphics2D g2d = (Graphics2D) g;

附录:这假设您在a中重写,然后将其添加到与Will的第二个线程(我的直升机视图)有关的
JFrame

还有安德鲁·汤普森的魔法地球仪的正确直觉

我补充道(我希望这是正确的,因为我不熟悉paint、paintComponent或paintComponent以及自定义图形)


不要调用
paint()
,而是看看它如何在计时器的
actionPerformed()
方法中使用
repaint()。他所说的对paintComponent(Graphics g)有效,这很可能是他想要说的。请向上投票,这个论坛上的一些帖子中有大量关于这方面的信息,但你在第一篇之前的原始帖子中是对的。修改,对于JFrame(根窗格)只有paint()+1而不是对
JFrame
本身进行自定义绘制,最好添加
JComponent
JPanel
(如果要包括其他组件)。当您认为在顶级容器中绘制效果最好时,您意识到您希望在另一个
JPanel
中在全屏
JWindow
、或
JDialog
、或
JInternalFrame
、或
边框布局的
中心
进行渲染,或者..扩展和超越
paintComponent()
的好例子。此级别没有UI委托,但有双缓冲区支持。顺便说一句,之前投票支持。
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);
    }
}