2014-03-12 64 views
0

我有一個堅持者與我認爲是一個相當簡單的問題。自定義JComponent未被添加到JPanel

我有一個自定義JComponent Ball這不過是一個簡單的橢圓形。我試圖將球添加到我設置爲JFrame默認內容窗格的JPanel(通過frame.setContentPane(mainPanel))。隨着球,我還有另外兩個類Paddle的組件,我創建的另一個自定義JComponent。奇怪的是,槳可以添加得很好。

有問題的面板有意使用絕對佈局來定位元素,因爲這應該是Pong遊戲的簡單娛樂。

在向JPanel添加球和兩個槳之後,我運行了一個簡單的測試,發現組件數組返回時只列出了兩個:槳。完整的代碼將所有的人都和初始化JPanel並JFrame的如下:

public Pong() 
{ 
    frame = new JFrame("Pong"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    mainPanel = new JPanel(null); 

    mainPanel.setBackground(Color.black); 
    mainPanel.setPreferredSize(new Dimension(500, 500)); 

    player = new Paddle(20, 100); 
    enemy = new Paddle(20, 100); 
    ball = new Ball(5, Color.GREEN); 

    mainPanel.add(player); 
    mainPanel.add(enemy); 
    mainPanel.add(ball); 
    enemy.setColor(Color.RED); 

    frame.setContentPane(mainPanel); 
    frame.pack(); 

    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
    int x = screen.width/2 - frame.getWidth()/2; 
    int y = screen.height/2 - frame.getHeight()/2; 
    frame.setLocation(x, y); 

    mainPanel.addKeyListener(mc); 

    frame.setVisible(true); 

    mainPanel.repaint(); 

    x = mainPanel.getWidth()/2 - ball.getWidth()/2; 
    y = mainPanel.getHeight()/2 - ball.getHeight()/2; 
    System.out.println("X: " + x + ", Y: " + y); 
    ball.setLocation(x, y); 

    x = 0; 
    y = mainPanel.getHeight()/2 - player.getHeight()/2; 
    System.out.println("X: " + x + ", Y: " + y); 
    player.setLocation(x, y); 

    x = mainPanel.getWidth() - enemy.getWidth(); 
    y = mainPanel.getHeight()/2 - enemy.getHeight()/2; 
    System.out.println("X: " + x + ", Y: " + y); 
    enemy.setLocation(x, y); 

    System.out.println(Arrays.deepToString(mainPanel.getComponents())); 

    mainPanel.repaint(); 

    frame.addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mousePressed(MouseEvent e) 
     { 
      mainPanel.requestFocus(); 
     } 
    }); 

    dm.start(); 
    mainPanel.requestFocus(); 
} 

爲球的代碼如下[注:球是私有的,因爲它是一個內部類Pong類,不延伸任何]:

private class Ball extends JComponent 
{ 
    private int radius; 
    private Color color; 

    public Ball(int size, Color c) 
    { 
     if(size > 0) 
      radius = size; 
     else 
      radius = 1; 
     this.setPreferredSize(new Dimension(radius, radius)); 
     color = c; 
    } 

    public Ball(int size) 
    { 
     this(size, Color.RED); 
    } 

    //Getters and Setters... 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     System.out.println("Radius: " + radius); 
     g.setColor(color); 
     g.fillOval(0, 0, radius, radius); 
    } 
} 

這已經不是我第一次上項目時遇到了這個問題,它似乎總是當我使用自定義JComponents絕對定位一起發生在JPanel上,雖然在其他項目中,我似乎沒有這個問題。這可能是我忽略的一些非常簡單的事情,但我無法想象它是什麼,對我而言是如此。任何答案將不勝感激。

如果絕對必要,all the lines of code for this project can be found here(總共超過300行)。

在此先感謝您的幫助!

+0

我忘了提:MC和DC是MoveManager和DISPLAYMANAGER分別,但應該有球的顯示屏上沒有任何影響。只是爲了清除那些未知的變量。 – Aargonian

+0

您忘記了在'Ball.paintComponent()'內調用'super.paintComponent(g)'。 – dic19

+0

儘管如此,我還是沒有對槳做過這樣的事情。我會解決這個問題,但這似乎不是問題的原因。 – Aargonian

回答

1

當您使用空佈局向面板添加組件時,則需要負責設置組件的sizelocation

如果你沒有設置大小,那麼它將是零,所以沒有什麼可以繪製。

+1

+1。 OP應該在'Ball'類構造函數中用'setSize'替換'setPreferredSize'。檢查一下[OP的代碼](http:// pastebin。COM/BKervdxt),他/她已經覆蓋(也許在不知不覺中)'getHeight'和'getWidth'方法'Paddle'類,這就是爲什麼這一次是畫,但'Ball'不是。 – dic19

0

該解決方案非常簡單。

添加以下調用構造函數和setRadius方法在你的球類:

this.setSize(new Dimension(radius, radius)); 

而且都應該很好。基本上,首選大小沒有強制執行,所以要明確:設置大小。否則,在重新繪製JPanel時,此組件的大小爲0並被跳過。

(基於評論,感謝編輯,我的揮杆是生鏽)

+1

請勿重寫這些方法。您應該使用setSize(...)或setBounds(...)方法。 – camickr

+0

謝謝,編輯。我的搖擺是生鏽的,忘記這是最好的做法。 – ProgrammerDan

相關問題