2011-06-07 42 views
2

我正在制作一个2D的垂直射击游戏,其中一切都是编码(和工作),但图形。我之前没有使用Graphics类,所以这对我来说都是新的。以下是我用来绘制JFrame的所有代码的代码:在JFrame中绘制Graphics2D

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中的点。我提醒你我以前从未这样做过,所以请告诉我这是否是错误的做法。

+2

而不是做的风俗画到'JFrame'本身的,最好是添加一个'JComponent'或'JPanel'(如果有其他成分,包括)。就在您认为顶层容器中的绘画最好时,您会意识到您需要在全屏“JWindow”,“JDialog”,或“JInternalFrame”或“CENTER”中进行渲染在另一个'JPanel'中的'BorderLayout',或者.. – 2011-06-07 05:50:24

回答

4

与威尔的第二个线程(我的直升机视图)大约同一件事Error with timer and JFrame

和正确的直觉安德鲁·汤普森的魔法世界各地的连接,则

我说(我希望这是正确的,因为我不是familair油漆,或的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); 
    } 
} 
+0

扩展['JComponent']的好例子(http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent。 html)并覆盖'paintComponent()'。在这个级别没有UI代理,但是有双重缓冲支持。以前投票表决,顺便说一句。 – trashgod 2011-06-07 20:30:31

6

改为替代paintComponent();它将提供Graphics上下文。你可以cast它到Graphics2D

Graphics2D g2d = (Graphics2D) g; 

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

+0

而不是调用'paint()',看看这个[示例](http://stackoverflow.com/questions/3256269/jtextfields-on-top-of- active-drawing-on-jpanel-threading-problems/3256941#3256941)在Timer的actionPerformed()方法中使用'repaint()'。 – trashgod 2011-06-07 04:44:46

+0

@Andrew Thompson:其实他部分是对的。他说要做的是为paintComponent(Graphics g)工作,这很可能是他想说的。 – Will 2011-06-07 06:58:11

+1

只是upvote,这个论坛上的一些线程有关于这方面的大量的信息,但你在第一次之前的原始帖子是正确的。 JFrame(RootPane)是否只有paint()+1 – mKorbel 2011-06-07 18:15:26