2012-09-28 44 views
2

我是新來的java。我確實有一門Java課程,但我想提前完成。我很喜歡!這是我的問題。我試圖畫出遊戲所需的兩個划槳。我爲他們做創建2名對象,他們都「秀」,但會發生以下情況:JPanels不會出現在JFame中

主要亞軍

import javax.swing.JFrame; 


public class PongRunner { 

    public static void main (String[] args) 
    { 

     new PongRunner(); 
    } 

    public PongRunner() 
    { 
     JFrame PongFrame= new JFrame(); 
     PongFrame.setSize(800,600); 
     PongFrame.add(new PaddleB()); 
     PongFrame.add(new PaddleA()); 
     PongFrame.setLocationRelativeTo(null); 
     PongFrame.setTitle("My Pong Game"); 
     PongFrame.setResizable(false); 
     PongFrame.setVisible(true); 
     PongFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 

PaddleAPaddleB都的drawRect圖形,繪製一個特定的矩形區域。

我告訴JFrame要先添加的圖形是唯一可見的圖形。它下面的那個不會被添加到框架中我想知道爲什麼,以及如何在同一個JFrame中繪製兩個槳...我正在閱讀我的書並儘可能地在互聯網上查看,但沒有運氣這兩天。一些幫助會很好。我剛開始學習java,我想我正在取得進展。有些提示會很好,謝謝:),actionListener,因爲我將不得不使用它們來移動槳! BOTH槳的

源代碼如下:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class PaddleA extends JPanel implements ActionListener 
{ 
    private Timer timer; 

    public void timer() 
    { 
     timer = new Timer(25, this); 
     timer.start(); 

    } 

public void actionPerformed(ActionEvent e) 
{ 
    repaint(); 
} 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.setColor(Color.RED); 
    g.fillRect(70,200,20,100);  
} 
} 

PaddleB:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class PaddleB extends JPanel implements ActionListener 
{ 

private Timer timer; 

    public void timer() 
    { 
     timer = new Timer(25, this); 
     timer.start(); 

    } 

    public void actionPerformed(ActionEvent e) 
    { 
     repaint(); 
    } 


    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     g.fillRect(500, 200, 20, 100); 

    } 

} 
+2

你真的相信這是一個刻板的邏輯適當的標題? – Aerus

+0

-1爲近距離選民。這個問題非常清楚,並且符合Stack Overflow的要求。 –

回答

0

我沒有時間去嘗試運行你的代碼,但嘗試設置「槳」的大小和位置對象,或將它們設置爲非透明。我認爲,搖擺試圖通過不拉絲,這是完全由另一種不透明的組件覆蓋的組件,加快渲染。由於這個原因,它可能不會畫出你的槳。

如果你設置你的撥片的大小和位置,你可能需要修改你的paintComponent方法:如果我的記憶是正確的,我認爲這是在被夾在組件的區域通過Graphics對象,所以0,0將是組件的左上角。

0

你不應該由JFrame#add(Component)方法你JPanels添加到您的JFrame。最好將它們添加到contentPane中:frame.getContentPane().add(panel);您應該閱讀關於LayoutManager的信息。他們可以通過在框架中放置組件來幫助您,或者如果使用不正確的東西,可能會造成混亂。

3

由於您已將2個調板添加到主要PongFrame的相同BorderLayout.CENTER位置,因此只會顯示第二個調板。

這種類型的繪畫更容易使用一個Graphics對象在一個JComponent上完成。

+1

+1是的我同意「這種類型的繪畫更容易使用一個JComponent上的一個Graphics對象完成」 –

3

擺動組件的設計並非如此。每個paddle JPanel都試圖繪製一個矩形,但容器(JFrame)及其佈局管理器將控制JPanel的大小和位置。於是,他們畫的矩形可能是他們的邊界之外,並不會出現在所有。

一些佈局管理器將只顯示JPanels之一,如果你將它們添加了一個又一個這樣的 - 看到答案由Reimus

要做這樣的動畫圖形,您可能需要從填充JFrame的單個JComponent(例如JPanel)開始,然後將兩個划槳作爲矩形塗在它上面。

3

這是因爲添加的第一個槳,然後在第一加第二葉片從而取代他們:

PongFrame.add(new PaddleB()); 
    PongFrame.add(new PaddleA()); 

嘗試使用LayoutManager這兒僅僅是一個快速示例:

PongFrame.getContentPane().add(new PaddleB(),BorderLayout.WEST); 
    PongFrame.getContentPane().add(new PaddleA(),BorderLayout.EAST); 

您的g.fillRect(...);的x和y座標對於JFrame來說太大,因此不會顯示。更改它,如下所示:

g.fillRect(0,0, 20, 100); 

不,雖然相關:

  • 不使用JFrame.add()JFrame.getContentPane().add()

UPADTE:

正如其他人所提到的邏輯遊戲是位關閉。您應該有一個單獨的圖紙面板,該圖紙被添加到JFrame中,並且所有圖紙均使用Graphic s而不是JPanel s在單個JPanel上完成。這裏是一個小例子:

enter image description here

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class PongRunner { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new PongRunner(); 
      } 
     }); 
    } 

    public PongRunner() { 
     JFrame PongFrame = new JFrame(); 
     PongFrame.setTitle("My Pong Game"); 
     PongFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     PongFrame.setResizable(false); 
     PongFrame.setSize(400,400); 
     //PongFrame.setLocationRelativeTo(null); 
     PongFrame.getContentPane().add(new DrawingPanel()); 
     PongFrame.setVisible(true); 
    } 
} 

class DrawingPanel extends JPanel { 

    Rect rect1, rect2; 

    public DrawingPanel() { 
     super(true); 
     rect1 = new Rect(80, 80, 20, 100, Color.yellow); 
     rect2 = new Rect(100, 200, 20, 100, Color.red); 

    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(rect1.getColor()); 
     g.fillRect(rect1.getX(), rect1.getY(), rect1.getWidth(), rect1.getHeight()); 
     g.setColor(rect2.getColor()); 
     g.fillRect(rect2.getX(), rect2.getY(), rect2.getWidth(), rect2.getHeight()); 
    } 
} 

class Rect { 

    private Color color; 
    private int x, y, height, width; 

    Rect(int x, int y, int width, int height, Color color) { 
     this.x = x; 
     this.y = y; 
     this.height = height; 
     this.width = width; 
     this.color = color; 
    } 

    public Color getColor() { 
     return color; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public int getWidth() { 
     return width; 
    } 

    public int getHeight() { 
     return height; 
    } 

    public Rectangle getBounds() { 
     return new Rectangle(x, y, width, height); 
    } 
} 

請注意,這個片段是不是完美的,只是表明需要繪製矩形,形成了各種各樣的遊戲

+0

我試過這種感謝!但我希望他們改變他們的座標,我怎麼用BorderLayout.WEST做到這一點? –

+0

@JosePageMaldonado查看更新 –