這是我在stackoverflow上的第一篇文章,所以我希望我以正確的方式做到這一點。JPanel只顯示圖形的一小部分
無論如何,我試圖在JFrame內創建一個JPanel並在該面板內繪製一個Grid。因此,我已經重寫了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);
}
}
,這是它看起來的樣子(注意在左上角的12×12紅場,這應該是網格): http://imageshack.us/a/img818/3545/49409190.png
面板本身調整正確,但圖形不填充它。我不知道,也許我忽視了簡單的事情,但現在我不知道該怎麼做。我怎樣才能讓它畫整個網格?
編輯:啊,現在我覺得愚蠢。我的錯誤是命名getter'getWidth'和'getHeight',它們覆蓋JComponent中的方法。重命名後,它工作得很好。
請發佈包含用於初始化網格參數的相關代碼。考慮發佈[SSCCE](http://sscce.org/)。 – tenorsax
我現在解決了這個問題(見編輯),但由於:) – QBrute
你應該輸入作爲一個答案,[接受](http://meta.stackexchange.com/a/65088/155831)的答案。 –