簡體   English   中英

JAVA-創建帶有循環的彩色框行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM