2013-04-08 74 views
10

我在程序中創建了一個網格。以下是用於創建網格的代碼。在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 Painting2D Graphics的更多細節。

我建議不要試圖讓第二個組件來執行填充。簡單地提供在供給細胞的X/Y位置(在網格計)你網格類的方法和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

此更新內填充細胞可能聽起來很愚蠢,但我是新來的Java。我如何使用Graphics.fillRect(int,int.int,int)?現在這是如何使用它:function drawRectangle(int x1,int y1,int x2,int y2){Graphics.fillRect(int,int.int,int)}這可能嗎?程序是否自動將矩形添加到框架? – 2013-04-08 03:06:45

+0

編號'fillRect'是'Graphics'的一種方法,您需要引用'Graphics'上下文。所有的繪畫應該在'paint'方法的上下文中完成(最好是'paintComponent')。在你的'Grid'類中,我會提供一種叫'fillGrid(int x,int y)'的方法,告訴你要填充什麼單元格。在你的'paintComponent'方法中,然後我將確定這個單元格的矩形邊界,並使用'fillRect'(ps我更新了答案;))填充 – MadProgrammer 2013-04-08 03:10:29

+0

好吧,以便測試fillRect我已經添加了public void paint(Graphics g ,int x,int y)g.fillRect(x,y,10,10); }。我如何使用這個功能? – 2013-04-08 03:16:24