2013-04-08 5 views
10

Ho creato una griglia nel mio programma. Di seguito è riportato il codice utilizzato per creare la griglia.Creazione di una funzione di disegno di un rettangolo (riempito di colore nero) in Java per una griglia

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

} 

Quello che voglio fare è quello di creare una funzione che disegnare un rettangolo (pieno di colore nero) sulla base delle coordinate che mi danno. Fondamentalmente voglio popolare alcune celle della griglia con il colore nero e la mia idea è quella di disegnare rettangoli neri riempiti sulle coordinate della cella. Come faccio a fare questa funzione?

Ho provato a creare un'altra classe chiamata drawRectangle e l'ho richiamata nella funzione principale come window.getContentPane(). Add (new drawRectangle()); tuttavia ciò non ha funzionato (appare solo drawRectangle e non la griglia).

Voglio anche essere in grado di utilizzare questa funzione ripetutamente per continuare a creare rettangoli.

Come si crea questa funzione?

Anche se si conosce un modo migliore per strutturare questo programma, fatemelo sapere (sono nuovo di Java quindi sono aperto a qualsiasi suggerimento).

risposta

23
  1. Non utilizzare paint, utilizzare paintComponent e non dimenticare di chiamare super.paintComponent
  2. JComponent potrebbe non essere la scelta migliore, JPanel è probabilmente una scelta migliore
  3. Cosa c'è di sbagliato con Graphics#fillRect(int, int, int, int)?

Si potrebbe dare un'occhiata a Performing Custom Painting e 2D Graphics per ulteriori dettagli.

Mi piacerebbe non provare ad avere un secondo componente per eseguire il riempimento. Basta fornire un metodo in te classe di griglia che alimenta x/y posizione della cella (in termini di griglia) e riempire la cella all'interno della paintComponent metodo

Aggiornato con esempio

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

Questo potrebbe sembrare stupido ma w/e sono nuovo di Java. Come uso Graphics.fillRect (int, int.int, int)? In questo momento si vorrebbe usarlo: function drawRectangle (int x1, int y1, int x2, int y2) {Graphics.fillRect (int, int.int, int)} è possibile? Il programma aggiunge automaticamente il rettangolo al frame? –

+0

No. 'fillRect' è un metodo di' Graphics', è necessario un riferimento al contesto 'Graphics'. Tutto il dipinto dovrebbe essere fatto nel contesto di un metodo 'paint' (preferibilmente' paintComponent'). Nella tua classe 'Grid' fornirei un metodo chiamato qualcosa come' fillGrid (int x, int y) 'che ti dice quale cella riempire. Nel tuo metodo 'paintComponent', determinerei quindi i limiti rettangolari di questa cella e riempio usando' fillRect' (ps ho aggiornato la risposta;)) – MadProgrammer

+0

Ok quindi, solo per testare il fillRect ho aggiunto il public void paint (Grafica g , int x, int y) { \t g.fillRect (x, y, 10, 10); } nella classe Grid. Come uso questa funzione? –