Ich möchte ein Gitter zeichnen und Zeug in den Zellen zeichnen (um die Dinge einfach zu halten füllen Sie sie einfach). Insgesamt habe ich es funktioniert ziemlich nur in einigen Panel-Größen die Zelle ist etwa 1 Pixel von wo es platziert werden sollte (überlappend die Zeile). TBH Ich habe nicht wirklich genug Berechnungen durchgeführt, um die Antwort möglicherweise selbst zu finden, also entschuldige ich mich dafür, ich bin mir allerdings nicht ganz sicher, wie ich mich diesem "Bug" nähern soll.Berechne Zellgrößen und zeichne (mit Linien dazwischen) sie
Wie auch immer, hier ist der Code:
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));
}
}
Wenn Sie es ausführen werden Sie wahrscheinlich sehen, was ich meine. Ich kann mir keine gute Erklärung in Worten vorstellen. Zuerst dachte ich, ich müsste +1 zu x und y hinzufügen, da ich neben der Linie zeichnen möchte, aber das verschiebt (offensichtlich) das Problem einfach auf die andere Seite.
Das Laufen mit einer größeren GRÖßE (wie 30) gibt mir einen anderen Fehler, dass es offenen Raum zu den Seiten gibt. Ich weiß (oder nehme an), dass dies der Fall ist, weil ich Integer benutze und es nicht zu groß ist. Aber Hinweise für einen besseren Ansatz (im Allgemeinen) sind immer willkommen.
Definite +1 für eine gute SSCCE.org und klare, verständliche Frage. – Dariusz