我想繪製一個網格並在單元格中繪製東西(爲了保持簡單,只需填充它們)。總的來說,我只是在一些面板尺寸下工作得非常好,單元距離它應該放置的位置大約1個像素(重疊線)。 TBH我真的沒有做足夠的計算來自己找到答案,所以我很抱歉,我真的不太清楚如何處理這個「錯誤」。計算單元格大小並繪製它們之間的線條
總之,這裏的代碼:
public class Gui extends JFrame {
public static void main(String[] args) {
new Gui().setVisible(true);
}
public Gui() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
add(new JPanel() {
public static final int SIZE = 3;
/** Line thickness ratio to a block */
public static final float LINE_THICKNESS = 0.1f;
/** @return the width of a block. */
protected final int getBlockWidth() {
return getWidth()/SIZE;
}
/** @return the height of a block. */
protected final int getBlockHeight() {
return getHeight()/SIZE;
}
/** @return the width of a cell. */
protected final int getCellWidth() {
return (int) Math.ceil(getBlockWidth()*(1-LINE_THICKNESS));
}
/** @return the height of a cell. */
protected final int getCellHeight() {
return (int) Math.ceil(getBlockHeight()*(1-LINE_THICKNESS));
}
@Override
public void paintComponent(Graphics g) {
g.setColor(new Color(0, 0, 255, 100));
int lineWidth = (int) (LINE_THICKNESS * getBlockWidth());
int lineHeight = (int) (LINE_THICKNESS * getBlockHeight());
for(int i = 0; i <= SIZE; i++) {
g.fillRect(i * getBlockWidth() - lineWidth/2, 0, lineWidth, getHeight());
g.fillRect(0, i * getBlockHeight() - lineHeight/2, getWidth(), lineHeight);
}
g.setColor(new Color(255, 0, 0, 100));
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
int x = j * getBlockWidth() + lineWidth/2;
int y = i * getBlockHeight() + lineHeight/2;
Graphics temp = g.create(x, y, getCellWidth(), getCellHeight());
drawCell(temp, i, j);
}
}
}
private void drawCell(Graphics g, int i, int j) {
g.fillRect(0, 0, getCellWidth(), getCellHeight());
}
});
setLocation(new Point(500, 200));
setSize(new Dimension(600, 600));
}
}
如果你運行它,你可能會明白我的意思。我想不出一個好的解釋。起初我想我必須在x和y上加1,因爲我想在線旁邊畫,但是這(顯然)只是把問題轉移到了另一邊。
以更大的尺寸(比如30)來運行它給了我另一個錯誤,它給了開放空間。我知道(或假設)這是因爲我使用整數,但它並沒有太大的交易。但總是歡迎提供更好的方法(通常)。
定+1有一個良好的SSCCE.org和清晰,易於理解的問題。 – Dariusz