2013-04-08 7 views
10

Utworzono siatkę w moim programie. Poniżej znajduje się kod używany do utworzenia siatki.Tworzenie funkcji rysowania prostokąta (wypełniony czarnym kolorem) w Javie dla siatki

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

} 

Co chcę zrobić, to utworzyć funkcję, która będzie narysować prostokąt (wypełniony kolorem czarnym) na podstawie współrzędnych, które daję. Zasadniczo chcę wypełnić niektóre komórki siatki czarnym kolorem, a moim pomysłem jest narysowanie czarnych prostokątów na współrzędnych komórki. Jak mogę wykonać tę funkcję?

Próbowałem stworzyć kolejną klasę o nazwie drawRectangle i nazwał ją w głównej funkcji, jak so window.getContentPane(). Add (new drawRectangle()); jednak to nie zadziałało (pojawia się tylko drawRectangle, a nie siatka).

Chcę również móc korzystać z tej funkcji wielokrotnie, aby nadal tworzyć prostokąty.

Jak utworzyć tę funkcję?

Również, jeśli znasz lepszy sposób, w jaki powinienem zorganizować ten program, proszę daj mi znać (jestem nowy w Javie, więc jestem otwarty na wszelkie sugestie).

Odpowiedz

23
  1. Nie używaj paint użyć paintComponent i nie zapomnij zadzwonić super.paintComponent
  2. JComponent może nie być najlepszym wyborem, JPanel jest chyba lepszym wyborem
  3. Co z Graphics#fillRect(int, int, int, int)?

Aby uzyskać więcej informacji, możesz zajrzeć do Performing Custom Painting i 2D Graphics.

Poradziłbym, aby nie spróbować drugiego składnika do wypełnienia. Po prostu dostarczenie sposobu w was klasie siatki, które zasila komórki pozycji X/Y (pod względem siatki) i wypełnić komórkę wewnątrz metody

aktualizowana o przykład

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

ten paintComponent może brzmieć głupio, ale w/e jestem nowy w Javie. Jak korzystać z Graphics.fillRect (int, int.int, int)? W tej chwili chciałbyś go użyć: funkcja drawRectangle (int x1, int y1, int x2, int y2) {Graphics.fillRect (int, int.int, int)} jest to możliwe? Czy program automatycznie dodaje prostokąt do ramki? –

+0

Nr 'fillRect' jest metodą' Graphics', potrzebujesz odniesienia do kontekstu 'Graphics'. Wszelkie malowanie powinno odbywać się w kontekście metody "malowania" (najlepiej "malowania"). W twojej klasie 'Grid' zapewniłbym metodę o nazwie coś w rodzaju' fillGrid (int x, int y) ', która mówi ci, którą komórkę wypełnić. W twojej metodzie 'paintComponent' określiłbym wtedy granice prostokąta tej komórki i wypełnij używając' fillRect' (ps, ja zaktualizowałem odpowiedź;)) – MadProgrammer

+0

OK, więc po prostu przetestuj fillRect Dodałem publiczny void paint (Graphics g , int x, int y) { \t g.fillRect (x, y, 10, 10); } w klasie siatki. Jak korzystać z tej funkcji? –