由於某種原因,我的JComponents沒有顯示在我的JPanel上。JComponents未顯示在JPanel上
這裏是我的代碼:
主類
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
// Main Class - executes the game
public class Main extends JFrame
{
public static int WIDTH = 800, HEIGHT = 800;
private JPanel jp;
private Dimension d;
private Snake s;
private Food f;
public Main()
{
setTitle("Snake");
setSize(WIDTH, HEIGHT);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
d = new Dimension(WIDTH, HEIGHT);
jp = new JPanel();
jp.setBackground(Color.GRAY);
jp.setPreferredSize(d);
getContentPane().add(jp);
// adds the snake
s = new Snake();
jp.add(s);
// adds food
f = new Food();
jp.add(f);
}
@Override
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
}
public static void main(String args[])
{
new Main();
}
}
SNAKE CLASS
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JComponent;
// Snake Class - creates the Snake object
public class Snake extends JComponent implements KeyListener
{
public ArrayList snakeList = new ArrayList();
public int snakeX, snakeY, snakeWidth, snakeHeight;
public Snake()
{
snakeX = 100;
snakeY = 100;
snakeWidth = 20;
snakeHeight = 20;
snakeList.add(1);
addKeyListener(this);
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.RED);
g2.fillRect(snakeX, snakeY, snakeWidth, snakeHeight);
}
@Override
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP)
{
snakeX += 10;
System.out.println("Up");
}
if(e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_DOWN)
{
snakeX -= 10;
System.out.println("Down");
}
if(e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT)
{
snakeY += 10;
System.out.println("Right");
}
if(e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT)
{
snakeY -= 10;
System.out.println("Left");
}
}
@Override
public void keyReleased(KeyEvent e)
{
}
@Override
public void keyTyped(KeyEvent e)
{}
}
食品類
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JPanel;
// Food Class - the class that adds more Snake objects when collided with Snake
public class Food extends JComponent
{
private Random r = new Random();
public int foodX, foodY, foodWidth = 20, foodHeight = 20;
public Food()
{
foodX = 400;
foodY = 400;
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.YELLOW);
g2.fillRect(foodX, foodY, foodWidth, foodHeight);
}
}
正如你所看到的,我有3類:2 JComponents和1個JFrame (我的主課)。
主類中有一個JPanel被添加到JFrame中,然後JPanel添加了這兩個JComponents,但由於某種原因JComponents在執行時沒有顯示出來,儘管我很確定我有一切正確完成。
如果有人知道爲什麼這不起作用,那真棒。謝謝!
謝謝你的回答!爲了說清楚,你說我的Main中只有一個paintComponent(),而不是在我的Snake或Food類中?而且,我將使用Main擴展JPanel而不是JFrame。如果是這樣的話,我在哪裏創建我的主類中的蛇和食物對象?而且,我可以將keyListener保留在Snake類中,還是應該將它放在Main類中? – Samkough
@Samkough:看編輯 –
好吧,非常感謝你這麼多人!我會嘗試單獨獨奏,看看它是如何發展的! – Samkough