[英]JAVA - Creating a Row of Colored Boxes with Loops?
我是圖形和Java的初學者。 看來無論我做什么,該程序都無法正常工作! :(無論如何,目標是“使用嵌套循環,圖形和Math.random()來打印正方形圖案”模式是30x30正方形,彼此相鄰,每14行20列。這是到目前為止的代碼:
import java.awt.Color; import java.awt.Font; import java.awt.Canvas; class ColoredBoxes extends Canvas { public ColoredBoxes() { setBackground(Color.BLACK); } public void paint( Graphics window ) { window.setColor(Color.RED); window.setFont(new Font("TAHOMA",Font.BOLD,12)); window.drawString("**Fun Fact: I hate snow.**", 20, 40 ); window.drawString("Drawing boxes with nested loops ", 20, 80 ); //private static final int WIDTH = 800; //private static final int HEIGHT = 600; //Boxes: 20 Across, 14 Down drawBoxes(window); } public void drawBoxes(Graphics window) { //nested loops to draw the pretty boxes //int drawRow = 1; //int drawCol = 1; int c1 = (int)(Math.random()*256); int c2 = (int)(Math.random()*256); int c3 = (int)(Math.random()*256); Color random = new Color (c1,c2,c3); int dS = 30; //Distance from the side (left) int dT = 100; //Distance from the top int x = 30; //Width int y = 30; //Height for(int drawRow = 1; drawRow <= 14; drawRow++) { for(int drawCol = 1; drawCol <= 20; drawCol++) { window.setColor(Color.white); window.fillRect(dS, dT, x, y); window.setColor(Color.black); window.drawRect(dS, dT, x, y); System.out.println(); dS = dS+y; } dT = dT+x; } } }
每個方塊也應使用不同的隨機顏色。 我做錯了什么? 非常感謝 :)
首先看一下在AWT和Swing中 執行自定義繪畫和繪畫,以了解有關繪畫實際工作的詳細信息。
您無需控制繪畫過程,這意味着繪畫可能會出於任何原因隨時發生,其中許多是您無法控制的。 這意味着,每次調用drawBoxes
,您都在生成新的顏色。
繪畫也由一系列方法調用組成,這有助於提供更好的自定義機會,但是您不首先調用super.paint
就打破了這個繪畫鏈。
我要做的是首先創建一個顏色List
或顏色數組,它們代表網格中的每個單元格。 每當調用paint
,我都會使用此方法來確保paint
一致
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ColoredBoxes {
public static void main(String[] args) {
new ColoredBoxes();
}
public ColoredBoxes() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class TestPane extends JPanel {
protected static final int ROWS = 14;
protected static final int COLS = 20;
protected static final int BOX_SIZE = 30;
private List<Color> colors;
public TestPane() {
int length = ROWS * COLS;
colors = new ArrayList<>(length);
for (int index = 0; index < length; index++) {
int c1 = (int) (Math.random() * 255);
int c2 = (int) (Math.random() * 255);
int c3 = (int) (Math.random() * 255);
colors.add(new Color(c1, c2, c3));
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(COLS * BOX_SIZE, ROWS * BOX_SIZE);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int xOffset = (getWidth() - (COLS * BOX_SIZE)) / 2;
int yOffset = (getHeight() - (ROWS * BOX_SIZE)) / 2;
System.out.println("...");
for (int row = 0; row < ROWS; row++) {
for (int col = 0; col < COLS; col++) {
int index = (row * COLS) + col;
g2d.setColor(colors.get(index));
g2d.fillRect(xOffset + (col * BOX_SIZE),
yOffset + (row * BOX_SIZE),
BOX_SIZE, BOX_SIZE);
}
}
g2d.dispose();
}
}
}
更新
基本問題圍繞着如何計算每個單元格的行/列位置以及是否濫用Graphics#draw/fillRectangle
方法。
雖然您可以簡單地增加for-loop
內每個網格的x/y
位置,但一種更簡單的方法是根據當前row/col
簡單地計算它們
int xOffset = 50;
int yOffset = 100;
for (int drawRow = 0; drawRow < 14; drawRow++) {
for (int drawCol = 0; drawCol < 20; drawCol++) {
int x = drawCol * 30 + xOffset;
int y = (drawRow * 30) + yOffset;
下一個問題是濫用Graphics#draw/fillRect
。 JavaDocs指出
公共抽象無效fillRect(int x,
詮釋
整數寬度
整數高度)
填充指定的矩形。 矩形的左邊緣和右邊緣位於x和x +寬度-1。頂部和底部邊緣位於y和y +高度-1。所得的矩形覆蓋着一個寬像素寬乘高像素高的區域。 使用圖形上下文的當前顏色填充矩形。
參數:
x-要填充的矩形的x坐標。
y-要填充的矩形的y坐標。
width-要填充的矩形的寬度。
height-要填充的矩形的高度。
這意味着最后兩個參數應該是30, 30
,而不是您當前傳遞給它們的任何參數。
您還必須調用super.paint(window);
在執行任何自定義繪畫之前。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.