我有一個堅持者與我認爲是一個相當簡單的問題。自定義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行)。
在此先感謝您的幫助!
我忘了提:MC和DC是MoveManager和DISPLAYMANAGER分別,但應該有球的顯示屏上沒有任何影響。只是爲了清除那些未知的變量。 – Aargonian
您忘記了在'Ball.paintComponent()'內調用'super.paintComponent(g)'。 – dic19
儘管如此,我還是沒有對槳做過這樣的事情。我會解決這個問題,但這似乎不是問題的原因。 – Aargonian