在Java中为网格创建绘制矩形(填充黑色)函数

Posted

技术标签:

【中文标题】在Java中为网格创建绘制矩形(填充黑色)函数【英文标题】:Creating a draw rectangle (filled with black color) function in Java for a grid 【发布时间】:2013-03-30 00:48:29 【问题描述】:

我在我的程序中创建了一个网格。下面是用于创建网格的代码。

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 新手,所以我愿意接受任何建议)。

【问题讨论】:

【参考方案1】:
    不要使用paint,使用paintComponent,不要忘记致电super.paintComponent JComponent 可能不是最佳选择,JPanel 可能是更好的选择 Graphics#fillRect(int, int, int, int) 有什么问题?

您可以查看Performing Custom Painting 和2D Graphics 了解更多详情。

我建议不要尝试使用第二个组件来执行填充。只需在网格类中提供一个方法,该方法提供单元格的 x/y 位置(以网格形式)并在 paintComponent 方法中填充单元格

更新示例

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

【讨论】:

这听起来可能很愚蠢,但我是 Java 新手。如何使用 Graphics.fillRect(int,int.int,int)?现在这是要如何使用它: function drawRectangle(int x1, int y1, int x2, int y2) Graphics.fillRect(int,int.int,int) 这可能吗?程序会自动将矩形添加到框架中吗? 没有。 fillRectGraphics 的一个方法,你需要引用Graphics 上下文。所有绘画都应该在paint 方法的上下文中完成(最好是paintComponent)。在您的Grid 类中,我将提供名为fillGrid(int x, int y) 之类的方法,它会告诉您要填充哪个单元格。在您的paintComponent 方法中,我将确定此单元格的矩形边界并使用fillRect 填充(ps 我更新了答案;)) 好吧,只是为了测试 fillRect 我添加了 public void paint(Graphics g, int x, int y) g.fillRect(x, y, 10, 10); 在网格类中。如何使用此功能? 太棒了。谢谢,非常感谢。 你的回答已经解决了我的问题。但是,仅出于学习目的,您能否解释 (Point fillCell : fillCells) 我不熟悉语法。你也能解释一下私有 List fillCells;.

以上是关于在Java中为网格创建绘制矩形(填充黑色)函数的主要内容,如果未能解决你的问题,请参考以下文章

聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标

Java Swing:在 JPanel 的组件下绘制?

将矩形图像调整为正方形,保持比例并用黑色填充背景

[ATL/WTL]_[初级]_[解决自定义按钮禁用时没有绘制自定义样式-显示黑色矩形框的问题]

[ATL/WTL]_[初级]_[解决自定义按钮禁用时没有绘制自定义样式-显示黑色矩形框的问题]

[ATL/WTL]_[初级]_[解决自定义按钮禁用时没有绘制自定义样式-显示黑色矩形框的问题]