paintComponent 没有在整个 JPanel 中绘制
paintComponent is not drawing in the entire JPanel
我正在尝试让游戏变得蛇形并 运行 成为一个问题。我有一个名为 Segment 的 class,它用于创建包含 x 和 y 位置以及蛇的方向的对象。 class 扩展 JPanel 并覆盖方法 paintComponent()。然后,我将一个 Segment 类型的对象添加到另一个 class 中的 JFrame。我对蛇的 moving/changing 方向(目前实际上只是一个正方形)的方法非常有效,但我的问题是:
当正方形达到框架宽度的大约一半或框架高度的一半时,它将停止绘制。我已将 JPanel 的背景设为浅灰色,因此我知道正方形在停止时尚未到达 JPanel 的末尾。下面是我的简单 paintComponent() 方法和 class 中扩展 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);
}
我也知道对象的位置不会停止更新,所以问题就出在整个 panel/frame 中正方形的绘制上。感谢任何帮助!
这是一个 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();
}
}
不要覆盖段 class 的 getX() 和 getY()。
这些是所有Swing组件的方法。他们获取组件在父容器中的当前位置。
使用不同的方法名来控制画蛇的位置。由于您的变量名称是 xPos 和 yPos 可能使用 getXPos() 和 getYPos()。
所以发生的情况是,蛇是在相对于 Segment 面板的 xPos/yPos 处绘制的,并且 Segment 面板也是在相对于其父容器的 xPos/yPos 处绘制的。
我正在尝试让游戏变得蛇形并 运行 成为一个问题。我有一个名为 Segment 的 class,它用于创建包含 x 和 y 位置以及蛇的方向的对象。 class 扩展 JPanel 并覆盖方法 paintComponent()。然后,我将一个 Segment 类型的对象添加到另一个 class 中的 JFrame。我对蛇的 moving/changing 方向(目前实际上只是一个正方形)的方法非常有效,但我的问题是:
当正方形达到框架宽度的大约一半或框架高度的一半时,它将停止绘制。我已将 JPanel 的背景设为浅灰色,因此我知道正方形在停止时尚未到达 JPanel 的末尾。下面是我的简单 paintComponent() 方法和 class 中扩展 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);
}
我也知道对象的位置不会停止更新,所以问题就出在整个 panel/frame 中正方形的绘制上。感谢任何帮助!
这是一个 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();
}
}
不要覆盖段 class 的 getX() 和 getY()。
这些是所有Swing组件的方法。他们获取组件在父容器中的当前位置。
使用不同的方法名来控制画蛇的位置。由于您的变量名称是 xPos 和 yPos 可能使用 getXPos() 和 getYPos()。
所以发生的情况是,蛇是在相对于 Segment 面板的 xPos/yPos 处绘制的,并且 Segment 面板也是在相对于其父容器的 xPos/yPos 处绘制的。