2011-06-07 81 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