在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) 这可能吗?程序会自动将矩形添加到框架中吗? 没有。fillRect
是Graphics
的一个方法,你需要引用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以上是关于在Java中为网格创建绘制矩形(填充黑色)函数的主要内容,如果未能解决你的问题,请参考以下文章
聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标
[ATL/WTL]_[初级]_[解决自定义按钮禁用时没有绘制自定义样式-显示黑色矩形框的问题]