Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JComponents没有出现在JPanel上_Java_Swing_Jframe_Jpanel_Jcomponent - Fatal编程技术网

Java JComponents没有出现在JPanel上

Java JComponents没有出现在JPanel上,java,swing,jframe,jpanel,jcomponent,Java,Swing,Jframe,Jpanel,Jcomponent,出于某种原因,我的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 cl

出于某种原因,我的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();
    }
}
蛇类

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(我的主类)

主类中有一个添加到JFrame中的JPanel,然后JPanel添加了这两个JComponents,但由于某种原因,当我执行时JComponents没有出现,尽管我非常确定我已经正确地完成了所有操作


如果有人知道为什么这不起作用,那就太棒了。谢谢

您的食物成分的首选尺寸为0,0,这是它首选的尺寸。一个简单的解决方案是设置其首选大小或重写其
getPreferredSize()
方法,但我认为即使这样做,您的程序也可能暴露出更大的问题。我假设您希望在同一屏幕空间中同时显示您的蛇和食物。如果是这样,那么您的程序结构是错误的——food和snake类不应该是组件类(例如,不应该扩展JPanel或JComponent),而应该是逻辑类。您应该只有一个JPanel for drawing,它的paintComponent被覆盖,并且在这个方法中它可以绘制蛇和食物

还有一点:您正在重写JFrame的绘制方法,这是一件危险的事情。幸运的是,你目前正在做任何伤害,但它的存在可能会诱惑你以后在那里画。不要。我建议你消除这种方法和诱惑。我自己的偏好是几乎从不扩展JFrame,因为这样做几乎没有理由,而且这样做有风险


关于你的评论:

为了说明这一点,您的意思是在我的Main中只有一个paintComponent()

我不知道你的“主要”是什么。如上所述,我将创建一个用于绘制的JPanel,覆盖其
受保护的void paintComponent(Graphics g)
方法,然后在此方法中绘制蛇和食物

我的蛇课和食物课都没有

对。蛇和食物不应延伸摆动组件,因此不应覆盖摆动组件。我会给他们一个
public void draw(Graphics g)
方法,该方法在上述类的paintComponent方法中调用,并传入JVM提供的Graphics或Graphics2D对象

而且,我将使我的主扩展JPanel而不是JFrame。如果是这样的话,我应该在我的主类中在哪里创建Snake和Food对象

这些细节将取决于您的实际代码。我相信你会明白的

另外,我可以将keyListener保留在Snake类中,还是应该将其放在Main类中


我几乎从不使用键盘监听器,而是喜欢使用键盘监听器。查看我的示例代码,了解更多信息

您的食物成分的首选尺寸为0,0,这是它首选的尺寸。一个简单的解决方案是设置其首选大小或重写其
getPreferredSize()
方法,但我认为即使这样做,您的程序也可能暴露出更大的问题。我假设您希望在同一屏幕空间中同时显示您的蛇和食物。如果是这样,那么您的程序结构是错误的——food和snake类不应该是组件类(例如,不应该扩展JPanel或JComponent),而应该是逻辑类。您应该只有一个JPanel for drawing,它的paintComponent被覆盖,并且在这个方法中它可以绘制蛇和食物

还有一点:您正在重写JFrame的绘制方法,这是一件危险的事情。幸运的是,你目前正在做任何伤害,但它的存在可能会诱惑你以后在那里画。不要。我建议你消除这种方法和诱惑。我自己的偏好是几乎从不扩展JFrame,因为这样做几乎没有理由,而且这样做有风险


关于你的评论:

为了说明这一点,您的意思是在我的Main中只有一个paintComponent()

我不知道你的“主要”是什么。如上所述,我将创建一个用于绘制的JPanel,覆盖其
受保护的void paintComponent(Graphics g)
方法,然后在此方法中绘制蛇和食物

我的蛇课和食物课都没有

对。蛇和食物不应延伸摆动组件,因此不应覆盖摆动组件。我会给他们一个
public void draw(Graphics g)
方法,该方法在上述类的paintComponent方法中调用,并传入JVM提供的Graphics或Graphics2D对象

而且,我将使我的主扩展JPanel而不是JFrame。如果是这样的话,我应该在我的主类中在哪里创建Snake和Food对象

这些细节将取决于您的实际代码。我相信你会明白的

另外,我可以将keyListener保留在Snake类中,还是应该将其放在Main类中


我几乎从不使用键盘监听器,而是喜欢使用键盘监听器。查看我的示例代码,了解更多信息

谢谢你的回答!为了清楚起见,您是说在我的Main中只有一个paintComponent(),而在Snake或Food类中都没有?而且,我将使我的主扩展JPanel而不是JFrame。如果是这样的话,我应该在我的主类中在哪里创建Snake和Food对象?还有,我可以把keyListener放在Snake类中还是放在Main类中?好的,非常感谢你!剩下的我试着独唱,看看怎么样!谢谢你的回答!为了清楚起见,您是说在我的Main中只有一个paintComponent(),而在Snake或Food类中都没有?而且,我将使我的主扩展JPanel而不是JFrame。如果是这样的话,我应该在我的主类中在哪里创建Snake和Food对象?还有,我能保留钥匙吗