簡體   English   中英

paintComponent不在整個JPanel中繪制

[英]paintComponent is not drawing in the entire 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()。

因此發生的情況是,蛇相對於“段”面板在xPos / yPos處繪制,而“段”面板也相對於其父容器在xPos / yPos處繪制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM