Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 paintComponent未在整个JPanel中绘制_Java_Swing_Jframe_Jpanel_Paintcomponent - Fatal编程技术网

Java paintComponent未在整个JPanel中绘制

Java paintComponent未在整个JPanel中绘制,java,swing,jframe,jpanel,paintcomponent,Java,Swing,Jframe,Jpanel,Paintcomponent,我正试图让游戏变成蛇,但遇到了一个问题。我有一个叫做Segment的类,用于创建包含x和y位置以及蛇的方向的对象。该类扩展了JPanel并重写了方法paintComponent()。然后,我将Segment类型的对象添加到另一个类中的JFrame中。我所用的移动/改变蛇方向的方法(目前实际上只是一个正方形)非常有效,但我的问题是: 当正方形达到框架宽度的一半或框架高度的一半时,停止绘制。我已经将JPanel的背景设置为浅灰色,所以我知道当它停止时,正方形还没有到达JPanel的末端。下面是我的简

我正试图让游戏变成蛇,但遇到了一个问题。我有一个叫做Segment的类,用于创建包含x和y位置以及蛇的方向的对象。该类扩展了JPanel并重写了方法paintComponent()。然后,我将Segment类型的对象添加到另一个类中的JFrame中。我所用的移动/改变蛇方向的方法(目前实际上只是一个正方形)非常有效,但我的问题是:

当正方形达到框架宽度的一半或框架高度的一半时,停止绘制。我已经将JPanel的背景设置为浅灰色,所以我知道当它停止时,正方形还没有到达JPanel的末端。下面是我的简单paintComponent()方法和类中扩展JFrame的部分,我在其中添加了对象

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    this.setBackground(Color.LIGHT_GRAY);
    g.setColor(Color.black);
    g.fillRect(xpos, ypos, width, height);
}

public Snake() {
        setLayout(new BorderLayout());
        addKeyListener(l);
        segment = new Segment(100, 100, Segment.Dir.RIGHT);
        segment.setPreferredSize(new Dimension(500,500));
        add(segment, BorderLayout.CENTER);
        timer.start();
        setVisible(true);
        pack();
        setTitle("Snake");
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
我还知道对象的位置不会停止更新,所以问题在于整个面板/框架中的正方形的绘制。谢谢你的帮助

这是一个MCVE:

import java.awt.*;
import javax.swing.*;

public class Segment extends JPanel {

private int width = 10;
private int height = 10;
private int xpos, ypos;
private Dir dir;

public enum Dir {
    LEFT, RIGHT, UP, DOWN;
}

public Segment() {
    xpos = 0;
    ypos = 0;
    dir = Dir.RIGHT;
}

public Segment(int x, int y, Dir d) {
    xpos = x;
    ypos = y;
    dir = d;
}

public Dir getDir() {
    return dir;
}
public void setDir(Dir d) {
    dir = d;
}
public void setX(int x) {
    xpos = x;
    repaint();
}
public void setY(int y) {
    ypos = y;
    repaint();
}
public int getX() {
    return xpos;
}
public int getY() {
    return ypos;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    this.setBackground(Color.LIGHT_GRAY);
    g.setColor(Color.black);
    g.fillRect(xpos, ypos, width, height);
}
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Snake extends JFrame implements ActionListener {

Segment segment;
Timer timer = new Timer(50, this);

public Snake() {
    setLayout(new BorderLayout());
    setSize(500,500);
    segment = new Segment(100, 100, Segment.Dir.RIGHT);
    segment.setPreferredSize(new Dimension(getWidth(),getHeight()));
    add(segment, BorderLayout.CENTER);
    timer.start();
    setVisible(true);
    setTitle("Snake");
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
}

    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == timer) {
            segment.setX((segment.getX() + 4 + getWidth())%getWidth());
    }
}

public static void main(String[] arg) {
    new Snake();
}

}
不要重写Segment类的getX()和getY()

这些是所有Swing组件的方法。它们获取组件在父容器中的当前位置

使用不同的方法名称来控制蛇的绘制位置。因为变量名是xPos和yPos,所以可以使用getXPos()和getYPos()

因此,发生的情况是,相对于段面板,snake在xPos/yPos处绘制,而段面板也相对于其父容器在xPos/yPos处绘制

不要重写Segment类的getX()和getY()

这些是所有Swing组件的方法。它们获取组件在父容器中的当前位置

使用不同的方法名称来控制蛇的绘制位置。因为变量名是xPos和yPos,所以可以使用getXPos()和getYPos()


因此,发生的情况是,相对于段面板,snake在xPos/yPos处绘制,而段面板也相对于其父容器在xPos/yPos处绘制

尝试使用paint而不是paint component,并使用getWidth()和getHeight()可以在此处发布?@Locke覆盖的paint component应该可以工作,尤其是当它适用于其他正在使用的尺寸时drawn@phflack我在问题的末尾添加了一个MCVE。请尝试使用paint而不是paint组件,并使用getWidth()和getHeight()你能在这里发布一个?@Locke覆盖的paintComponent应该可以工作,特别是当它适用于其他正在使用的尺寸时drawn@phflack我在问题的末尾加了一个MCVE。