2013-04-08 11 views
10

Я создал сетку в своей программе. Ниже приведен код, используемый для создания сетки.Создание прямоугольника draw (заполнено черным цветом) в Java для сетки

import java.awt.Graphics; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 

class Grid extends JComponent { 
    public void paint(Graphics g) { 
     g.drawRect (10, 10, 800, 500);  

     for (int i = 10; i <= 800; i+= 10) 
      g.drawLine (i, 10, i, 510); 

     for (int i = 10; i <= 500; i+= 10) 
      g.drawLine (10, i, 810, i); 
    } 
} 

public class CoreControl { 

    public static void main(String[] a) { 
     JFrame window = new JFrame(); 
     window.setSize(840,560); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.getContentPane().add(new Grid()); 
     window.setVisible(true); 
    } 

} 

То, что я хочу сделать, это создать функцию, которая будет рисовать прямоугольник (заполненный черным цветом) на основе координат, которые я даю его. В основном я хочу заполнить определенные ячейки сетки черным цветом, и моя идея - нарисовать черные заполненные прямоугольники на координатах ячейки. Как это сделать?

Я попытался сделать еще один класс под названием drawRectangle и назвал его основной функцией, например window.getContentPane(). Add (new drawRectangle()); однако это не сработало (отображается только drawRectangle, а не сетка).

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

Как мне создать эту функцию?

Также, если вы знаете лучший способ, которым я должен структурировать эту программу, пожалуйста, дайте мне знать (я новичок в Java, поэтому я открыт для любых предложений).

ответ

23
  1. Не используйте paint, используйте paintComponent и не забудьте позвонить super.paintComponent
  2. JComponent не может быть лучшим выбором, JPanel, вероятно, лучший выбор
  3. Что случилось с Graphics#fillRect(int, int, int, int)?

Для получения более подробной информации, вы можете взглянуть на Performing Custom Painting и 2D Graphics.

Я бы посоветовал попросить второй компонент выполнить заполнение. Просто обеспечить метод в вас классе сетки, которая поставляет й/у позиции ячейки (в терминах сетки) и заполнить ячейку в paintComponent методе

Обновленного с примером

enter image description here

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Point; 
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 CoreControl { 

    public static class Grid extends JPanel { 

     private List<Point> fillCells; 

     public Grid() { 
      fillCells = new ArrayList<>(25); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      for (Point fillCell : fillCells) { 
       int cellX = 10 + (fillCell.x * 10); 
       int cellY = 10 + (fillCell.y * 10); 
       g.setColor(Color.RED); 
       g.fillRect(cellX, cellY, 10, 10); 
      } 
      g.setColor(Color.BLACK); 
      g.drawRect(10, 10, 800, 500); 

      for (int i = 10; i <= 800; i += 10) { 
       g.drawLine(i, 10, i, 510); 
      } 

      for (int i = 10; i <= 500; i += 10) { 
       g.drawLine(10, i, 810, i); 
      } 
     } 

     public void fillCell(int x, int y) { 
      fillCells.add(new Point(x, y)); 
      repaint(); 
     } 

    } 

    public static void main(String[] a) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       Grid grid = new Grid(); 
       JFrame window = new JFrame(); 
       window.setSize(840, 560); 
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       window.add(grid); 
       window.setVisible(true); 
       grid.fillCell(0, 0); 
       grid.fillCell(79, 0); 
       grid.fillCell(0, 49); 
       grid.fillCell(79, 49); 
       grid.fillCell(39, 24); 
      } 
     }); 
    } 
} 
+1

Этих может показаться глупым, но w/e я новичок в Java. Как использовать Graphics.fillRect (int, int.int, int)? Прямо сейчас, как это хотелось бы использовать: function drawRectangle (int x1, int y1, int x2, int y2) {Graphics.fillRect (int, int.int, int)} это возможно? Автоматически добавляет ли программа прямоугольник в рамку? –

+0

№ 'fillRect' - это метод' Graphics', вам нужна ссылка на контекст «Graphics». Вся окраска должна выполняться в контексте метода «paint» (желательно «paintComponent»). В вашем классе «Grid» я бы предложил метод, называемый «fillGrid (int x, int y)», который сообщает вам, какую ячейку заполнить. В вашем методе 'paintComponent' я тогда определял бы границы прямоугольника этой ячейки и заполнял бы с помощью' fillRect' (ps я обновил ответ;)) – MadProgrammer

+0

Итак, просто чтобы проверить fillRect, я добавил публичную краску void (Graphics g , int x, int y) { \t g.fillRect (x, y, 10, 10); } в классе Grid. Как использовать эту функцию? –

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