web-dev-qa-db-fra.com

Création d'une fonction de dessin de rectangle (rempli de couleur noire) dans Java pour une grille

J'ai créé une grille dans mon programme. Vous trouverez ci-dessous le code utilisé pour créer la grille.

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

}

Ce que je veux faire, c'est créer une fonction qui dessine un rectangle (rempli de couleur noire) en fonction des coordonnées que je lui donne. Fondamentalement, je veux remplir certaines cellules de la grille de couleur noire et mon idée est de dessiner des rectangles remplis de noir sur les coordonnées des cellules. Comment puis-je faire cette fonction?

J'ai essayé de créer une autre classe appelée drawRectangle et je l'ai appelée dans la fonction principale comme so window.getContentPane (). Add (new drawRectangle ()); mais cela n'a pas fonctionné (seul drawRectangle apparaît et non la grille).

Je veux également pouvoir utiliser cette fonction à plusieurs reprises pour continuer à créer des rectangles.

Comment créer cette fonction?

Aussi, si vous connaissez une meilleure façon de structurer ce programme, faites-le moi savoir (je suis nouveau à Java donc je suis ouvert à toutes suggestions).

10
Veda Sadhak
  1. N'utilisez pas Paint, utilisez paintComponent et n'oubliez pas d'appeler super.paintComponent
  2. JComponent n'est peut-être pas le meilleur choix, JPanel est probablement un meilleur choix
  3. Quel est le problème avec Graphics#fillRect(int, int, int, int) ?

Vous pouvez jeter un œil à Exécution de peinture personnalisée et Graphiques 2D pour plus de détails.

Je déconseille d'essayer d'avoir un deuxième composant pour effectuer le remplissage. Fournissez simplement une méthode dans votre classe de grille qui fournit la position x/y de la cellule (en termes de grille) et remplissez la cellule dans la méthode paintComponent

Mis à jour avec l'exemple

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);
            }
        });
    }
}
26
MadProgrammer