2015-01-28 2 views
-1

Я начинаю с графикой, а также с Java все вместе. Кажется, что независимо от того, что я делаю, эта программа не работает! :(В любом случае, цель состоит в том, чтобы «Использовать вложенные циклы, графику и Math.random() для печати квадратного шаблона« Узор 30x30 квадратов рядом друг с другом в 14 строках на 20 столбцов. Вот мой код до сих пор:JAVA - Создание строки цветных ящиков с петлями?

import java.awt.Color; 
 
import java.awt.Font; 
 
import java.awt.Canvas; 
 

 
class ColoredBoxes extends Canvas 
 
{ 
 
\t public ColoredBoxes() 
 
\t { 
 
\t \t setBackground(Color.BLACK); 
 
\t } 
 

 
\t public void paint(Graphics window) 
 
\t { 
 
\t \t window.setColor(Color.RED); 
 
\t \t window.setFont(new Font("TAHOMA",Font.BOLD,12)); 
 
\t \t window.drawString("**Fun Fact: I hate snow.**", 20, 40); 
 
\t \t window.drawString("Drawing boxes with nested loops ", 20, 80); 
 
\t \t //private static final int WIDTH = 800; 
 
\t  //private static final int HEIGHT = 600; 
 
\t  //Boxes: 20 Across, 14 Down 
 

 

 
\t \t drawBoxes(window); 
 
\t } 
 

 
\t public void drawBoxes(Graphics window) 
 
\t { 
 
\t \t //nested loops to draw the pretty boxes 
 
\t \t //int drawRow = 1; 
 
\t \t //int drawCol = 1; 
 
\t \t int c1 = (int)(Math.random()*256); 
 
\t \t int c2 = (int)(Math.random()*256); 
 
\t \t int c3 = (int)(Math.random()*256); 
 
\t \t Color random = new Color (c1,c2,c3); 
 
\t \t int dS = 30; //Distance from the side (left) 
 
\t \t int dT = 100; //Distance from the top 
 
\t \t int x = 30; //Width 
 
\t \t int y = 30; //Height 
 
\t \t for(int drawRow = 1; drawRow <= 14; drawRow++) 
 
\t \t { 
 
\t \t  for(int drawCol = 1; drawCol <= 20; drawCol++) 
 
\t \t  { 
 
\t \t   
 
\t \t   window.setColor(Color.white); 
 
\t \t   window.fillRect(dS, dT, x, y); 
 
\t \t   window.setColor(Color.black); 
 
\t \t   window.drawRect(dS, dT, x, y); 
 
\t \t   System.out.println(); 
 
\t \t   
 
\t \t   dS = dS+y; \t 
 
\t \t  
 
\t \t  } 
 
\t \t  dT = dT+x; 
 
\t \t  
 
\t \t  
 
\t \t } 
 
\t \t \t 
 
\t 
 

 
} 
 
}

Каждый квадрат должен быть другой, случайный цвет Что я сделал неправильно Спасибо большое :)

ответ

2

Начните с взглянуть через.? Performing Custom Painting и Painting in AWT and Swing для получения подробной информации о живописи на самом деле работает.

Вы не контролируете процесс окраски, это означает, что покраска может произойти в любое время по любой причине, многие из которых находятся вне вашего контроля. Это означает, что каждый раз, когда вызывается drawBoxes, вы генерируете новые цвета.

Картина также представляет собой цепочку вызовов методов, которая помогает обеспечить лучшие возможности настройки, но вы нарушаете эту цепочку рисования, не назовите сначала super.paint.

Что бы я сделал, сначала создайте List или массив цветов, которые представляют каждую отдельную ячейку в вашей сетке. Я хотел бы использовать это каждый раз, когда paint был призван к тому, чтобы картина соответствовала

Pretty Grid

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(); 
     } 

    } 

} 

Обновлено

Основная проблема вращается вокруг того, как вы вычисления позиции строки/COL для каждой ячейки и неправильное использование метода Graphics#draw/fillRectangle.

В то время как вы могли бы просто увеличивать x/y положение каждой сетки в for-loop, более простой подход был бы просто вычислить их на основе текущего 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 Y,
                ширина INT,
                int height)

Заполняет указанный прямоугольник. Левый и правый края прямоугольника равны x и x + width - 1.Верхние и нижние края расположены на y и y + высоте - 1. Результирующий прямоугольник покрывает ширину области шириной пикселей в высоту высотой в высоту. Прямоугольник заполняется с использованием текущего цвета графического контекста .

Параметры:
x - координата x прямоугольника для заполнения.
y - координата y прямоугольника до заполняется.
width - ширина прямоугольника для заполнения.
height - высота прямоугольника для заполнения.

Это означает, что два последних параметра должны быть 30, 30, а не то, что когда-нибудь вы сейчас переходящих к ним.

Также вы ДОЛЖНЫ называть super.paint(window); перед выполнением любых пользовательских работ.

+0

Thats awesome but unfortuatley Я не могу изменить имена классов :( –

+0

Меня ничего не останавливает, но я потеряю очки на своей последней отметке для этой лаборатории. –

+1

Итак, используйте концепцию и введите в свой класс. Намерение предоставленного кода предназначено для демонстрации, вам нужно будет сделать это в соответствии с вашими потребностями ... – MadProgrammer

Смежные вопросы