1

我正在寻找一种Java方法来制作一个简单的网格,如果你拖动鼠标,它会填充像素。所以只是一个简单的绘图表面......

现在重要的是我可以选择分辨率或换句话说选择像素大小......

我需要在网格中绘制的图形作为神经网络中的输入模式。所以我想稍后在 2Darray 中检索信息。

例如:一个 20*20 的网格,其中每个“像素”(或正方形可能更合适)实际上是一个正方形,可以说是 10*10 实际像素。

如何制作一个简单的 PixelGrid,我可以在其中用鼠标绘制大像素(选择分辨率)?

4

2 回答 2

1
  1. 创建一个 2D 数组boolean(用于存储选定区域或像素),所有数组元素默认为 false。
  2. 将 a 添加MouseMotionListener到自定义绘画表面。
  3. 绘画表面可能是
    • 一个扩展的JPanel,或..
    • BufferedImage显示在一个JLabel
  4. 在该mouseDragged(MouseEvent)方法中,确定要转换为的“像素”,并将其设置为true.
  5. 要么repaint()在面板上调用,要么更新图像并重新绘制标签。
  6. 绘制时,改变每个true数组元素对应区域的颜色。
于 2013-05-01T12:21:27.173 回答
1

谢谢您的帮助!我认为有人可能已经制作了一个像我想要的那样的网格类,但我没有等待,而是接受了你的建议,开始按照你的思路编写自己的代码。

如果您只想执行并查看代码。我仍然对 dragMouse-action 有一个小问题,它总是填充我想要的那个正上方的正方形。为什么是这样?另外请告诉我我是否在代码中做了一些奇怪或不必要的事情。再次感谢你。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class GridBox extends JPanel implements MouseMotionListener {

    private static final long serialVersionUID = 1L;
    //The Array with the Rectangles
    private static List<List<DrawnRectangle>> pixels = new ArrayList<List<DrawnRectangle>>();
    //The Frame (JComponent)
    private static JFrame f = null;

    public GridBox()
    {
        this.addMouseMotionListener(this);
    }

    public static void main(String[] args)
    {
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setPreferredSize(new Dimension(400, 400));

        f.add(new GridBox());

        f.pack();
        f.setVisible(true);
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        drawGrid((Graphics2D)g, 20, 20, 400, 400);
    }

    public static void drawGrid(Graphics g, int rowAmount, int columnAmount, int width, int height)
    {
        int pixelSizeW = width / columnAmount;
        int pixelSizeH = height / rowAmount;

        DrawnRectangle.defaultThickness = 1;

        for(int row = 0; row < rowAmount; row++)
        {
            List<DrawnRectangle> currentRow = new ArrayList<DrawnRectangle>();

            for(int column = 0; column < columnAmount; column++)
            {
                DrawnRectangle current = new DrawnRectangle( f, (row*pixelSizeW), (column*pixelSizeH), pixelSizeW, pixelSizeH);
                currentRow.add(current);
                current.paint();
            }

            pixels.add(currentRow);
        }
    }

    public void clearGrid()
    {
        for( List<DrawnRectangle> ListRect : pixels)
        {
            for( DrawnRectangle rect : ListRect)
            {
                rect.clearInterior();
            }
        }
    }

    @Override
    public void mouseDragged(MouseEvent e)
    {
        Point p = e.getPoint();

        for( List<DrawnRectangle> ListRect : pixels)
        {
            for( DrawnRectangle rect : ListRect)
            {
                if( rect.contains(p))
                {
                    rect.fill(Color.black);
                }
            }
        }
    }

    @Override
    public void mouseMoved(MouseEvent arg0)
    {

    }
}
于 2013-05-02T11:15:17.040 回答