2012-10-14 76 views
1

這是我在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); 
} 
} 

,這是它看起來的樣子(注意在左上角的1​​2×12紅場,這應該是網格): http://imageshack.us/a/img818/3545/49409190.png

面板本身調整正確,但圖形不填充它。我不知道,也許我忽視了簡單的事情,但現在我不知道該怎麼做。我怎樣才能讓它畫整個網格?

編輯:啊,現在我覺得愚蠢。我的錯誤是命名getter'getWidth'和'getHeight',它們覆蓋JComponent中的方法。重命名後,它工作得很好。

+2

請發佈包含用於初始化網格參數的相關代碼。考慮發佈[SSCCE](http://sscce.org/)。 – tenorsax

+0

我現在解決了這個問題(見編輯),但由於:) – QBrute

+1

你應該輸入作爲一個答案,[接受](http://meta.stackexchange.com/a/65088/155831)的答案。 –

回答

0

我明白出了什麼問題。我分別爲getWidth()和getHeight()調用了getter的寬度和高度,這將覆蓋從JPanel繼承的方法。 將它們重命名爲不同的東西后,它的工作:) 但謝謝你所有的答覆!