当前位置: 首页 > 知识库问答 >
问题:

paintComponent没有在整个JPanel中绘制

连时铭
2023-03-14
@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);
    }
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();
}

}

共有1个答案

徐隐水
2023-03-14

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

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

使用不同的方法名称来控制画蛇的位置。由于变量名是xpo,ypo可能使用getXPos()和getYPos()。

 类似资料:
  • 问题内容: 我正在做一项家庭作业,我应该制作一个程序,使您可以绘制自定义形状和线条,并在屏幕上移动它们。 最初,我使用公共空隙进行绘画,但是当我调用重绘时,形状会闪烁。 因此,我切换到。但是,当我尝试绘制形状时,没有任何显示。我相信这是因为它不在顶部绘画。 框架在3行中有3个面板。 我想绘制的面板自然是Draw Box面板。 这是我目前拥有的代码: 问题答案: 您的Main类扩展了JPanel,具

  • 将显示JFrame和JPanel,但paintComponent方法不在JPanel上绘制。我只看到我添加的JLabel、JTextField和JButton,而没有看到应该在JPanel上绘制的内容。

  • 我对用Java制作GUI是新手。据我所知,有一个名为Graphics的类负责在JPanel中绘制形状。当我的应用程序启动时,我调用paintComponent方法,该方法绘制我正在编程的游戏的棋盘,paintComponent方法接受图形g作为输入。然而,稍后,我想更新棋盘,那么当用户做点击之类的事情时,我如何告诉在游戏开始时绘制棋盘的同一个g绘制其他东西呢? 我相信这应该有一个很简单的答案。

  • 问题内容: 我正在寻找有关如何在JPanel中绘制文本的最基本描述。我知道那里有十亿个教程,但是没有一个在我身边点击,我有一些具体的问题可能会帮助其他困惑的人。作为设置(测试应用程序),我有一个类,其中包含JLabel,JTextField,JButton和JPanel。该应用程序从一个外部文件中读取整数,并且在按下JButton时应在面板中显示其平均值。我已经整理了所有基础编程(即按钮响应并将平

  • 关于您要更改的注释添加公共显示(图形g) [链接]http://www3.canyons.edu/faculty/biblej/project6.html 1.)Project6类必须扩展JFrame类2.)Project6构造函数必须设置GUI窗口3.)一个新的抽象方法:public void display(Graphics g);应该添加到基和派生类4.)一个自定义JPanel必须使用pai

  • 我正在制作一个简单的2D游戏。每次滴答,我都想检查一个效果队列,该队列将启动一个线程以获得特定效果(淡入淡出过渡、音频淡入淡出等)。例如,在菜单屏幕上按“播放”将向该队列添加“淡出”消息,该消息将被处理并启动一个线程,以在我的游戏面板上绘制一个黑色矩形,并增加阿尔法值。 我重写了绘制组件(),并将我的图形对象发送到我的游戏状态管理器,它将图形对象传递到当前状态的绘制()。我目前没有一个效果状态(也