Java JPanel仅显示一小部分图形

Java JPanel仅显示一小部分图形,java,swing,resize,grid,paintcomponent,Java,Swing,Resize,Grid,Paintcomponent,这是我在stackoverflow上的第一篇文章,所以我希望我的做法是正确的 无论如何,我试图在JFrame内创建一个JPanel,并在该面板内绘制一个网格。因此,我重写了paintComponents()方法来实现这一点。我试图设置面板的preferredSize和minimumSize,但不管我怎么做,它只显示该面板的12x12部分 这是我的网格类: package gui; import java.awt.Color; import java.awt.Dimension; import

这是我在stackoverflow上的第一篇文章,所以我希望我的做法是正确的

无论如何,我试图在JFrame内创建一个JPanel,并在该面板内绘制一个网格。因此,我重写了paintComponents()方法来实现这一点。我试图设置面板的preferredSize和minimumSize,但不管我怎么做,它只显示该面板的12x12部分

这是我的网格类:

package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

import collections.MapUtils;
import executor.Robot;

public class Grid extends JPanel {
    private static final long serialVersionUID = 1L;
    private int rs = GUI.ROBOT_SIZE;

    private final int width;
    private final int height;
    private final Map<Coord, Color> colors;

    private int rx;
    private int ry;

    public Grid(int width, int height) {
        this.width = width;
        this.height = height;

        colors = MapUtils.hashMap();
        for(int i = 0; i < width; i++)
                for(int j = 0; j < height; j++)
                colors.put(new Coord(i, j), Color.WHITE);

        rx = width/2;
        ry = height/2;
        setPreferredSize(new Dimension(width * rs, height * rs));
        setBorder(BorderFactory.createLineBorder(Color.CYAN));
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
    return height;
}

public void update(Robot robot) {
    this.rx = width/2 + robot.getX();
    this.ry = height/2 + robot.getY();

    repaint();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    for(Map.Entry<Coord, Color> es : colors.entrySet()) {
        g.setColor(Color.RED);
//          g.setColor(es.getValue());
        Coord c = es.getKey();
        g.fillRect(c.getX()*rs, c.getY()*rs, rs, rs);
    }

    g.setColor(Color.BLACK);
    for(int i = 0; i <= width; i++)
        g.drawLine(i*rs, 0, i*rs, height*rs);
    for(int i = 0; i <= height; i++)
        g.drawLine(0, i*rs, width*rs, i*rs);

    g.setColor(Color.DARK_GRAY);
    g.drawOval(rx*rs, ry*rs, rs, rs);
    g.setColor(Color.LIGHT_GRAY);
    g.fillOval(rx*rs, ry*rs, rs, rs);
}
}
packagegui;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.util.Map;
导入javax.swing.BorderFactory;
导入javax.swing.JPanel;
导入collections.MapUtils;
进口执行器、机器人;
公共类网格扩展JPanel{
私有静态最终长serialVersionUID=1L;
private int rs=GUI.ROBOT_SIZE;
私有最终整数宽度;
私人最终整数高度;
私人最终地图颜色;
私人互联网接收;
私营企业;
公共网格(整数宽度、整数高度){
这个。宽度=宽度;
高度=高度;
colors=MapUtils.hashMap();
对于(int i=0;i对于(int i=0;i我找出了问题所在。我分别调用了宽度和高度的getter“getWidth()”和“getHeight()”,这覆盖了从JPanel继承的方法。
将它们重命名为不同的名称后,它起了作用:)

谢谢你的回复!

请发布包含初始化网格的参数的相关代码。考虑发布。我现在解决了这个问题(参见编辑),但是谢谢:你应该把它作为答案和答案。(
getHeight
/
Weight
)从
JPanel
paintComponent
的坐标,而不是
g.fillRect(c.getX()*rs,c.getY()*rs,rs,rs);
,然后
Graphics
将可与其父对象进行rasization(
JPanel
)您可以;尽管它可能因为过于本地化而关闭,但它可能会对未来的读者有所帮助。