1

これは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);
}
}

そして、これはどのように見えるかです(左上隅の12x12の赤い正方形に注意してください。これはグリッドである必要があります):http: //imageshack.us/a/img818/3545/49409190.png

パネル自体は正しくサイズ変更されていますが、グラフィックがパネルを埋めていません。わからない、簡単なことを見落としているかもしれないが、今はどうしたらいいのかわからない。グリッド全体をペイントするにはどうすればよいですか?

編集:ああ今私は愚かだと感じています。私の間違いは、JComponentのメソッドをオーバーライドしていたゲッターに「getWidth」と「getHeight」という名前を付けることでした。それらの名前を変更した後、それは完全に正常に機能しています。

4

1 に答える 1

0

私は何が悪いのかを理解しました。幅と高さのゲッターをそれぞれ「getWidth()」と「getHeight()」と呼び、JPanelから継承されたメソッドをオーバーライドしました。それらの名前を別の名前に変更した後、それは機能しました:)しかし、すべての返信に感謝します!

于 2012-10-17T11:13:06.663 に答える