Java 需要像素编辑器的网格类型吗

Java 需要像素编辑器的网格类型吗,java,grid,mouse,Java,Grid,Mouse,我目前正在尝试开发一个基本的像素编辑器应用程序,以积累我使用Java编程的经验。我设计它是为了让用户有几个颜色选项,他们点击一个选项,然后他们可以在网格中的单元格上拖动,然后改变颜色(就像一个典型的图像编辑器,但每个网格单元格上都有一个按扣) 你知道什么Java组件(如果有的话)能够在Java中实现这种类型的网格吗 我原以为每个单元格都是一个JButton,但这似乎效率极低,我不认为不单独单击每个单元格(按钮)就可以更改每个单元格(按钮)的颜色 非常感谢您的帮助。一个选择是使用一个大画布,并在上

我目前正在尝试开发一个基本的像素编辑器应用程序,以积累我使用Java编程的经验。我设计它是为了让用户有几个颜色选项,他们点击一个选项,然后他们可以在网格中的单元格上拖动,然后改变颜色(就像一个典型的图像编辑器,但每个网格单元格上都有一个按扣)

你知道什么Java组件(如果有的话)能够在Java中实现这种类型的网格吗

我原以为每个单元格都是一个JButton,但这似乎效率极低,我不认为不单独单击每个单元格(按钮)就可以更改每个单元格(按钮)的颜色


非常感谢您的帮助。

一个选择是使用一个大画布,并在上面截取事件。用画法(g)画出你需要的任何东西。

超过几百个组件是很尴尬的。获取大像素的一种简单方法是使用
drawImage()
并缩放鼠标坐标,如图和所示。这里有一个简单的例子


您可能希望签出此链接。。基本概念总是很重要,而且非常有用。嘿,你的像素编辑器有什么进展吗?我试图自己创造一个。你在GIT hub或任何其他公共回购上有吗?对不起,Jose,我前一阵子已经把它处理掉了,我恐怕:(使用的例子勉强可以接受。:-)
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

/** @see http://stackoverflow.com/questions/2900801 */
public class Grid extends JPanel implements MouseMotionListener {

    private final BufferedImage img;
    private int imgW, imgH, paneW, paneH;

    public Grid(String name) {
        super(true);
        Icon icon = UIManager.getIcon(name);
        imgW = icon.getIconWidth();
        imgH = icon.getIconHeight();
        this.setPreferredSize(new Dimension(imgW * 10, imgH * 10));
        img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = (Graphics2D) img.getGraphics();
        icon.paintIcon(null, g2d, 0, 0);
        g2d.dispose();
        this.addMouseMotionListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        paneW = this.getWidth();
        paneH = this.getHeight();
        g.drawImage(img, 0, 0, paneW, paneH, null);
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        Point p = e.getPoint();
        int x = p.x * imgW / paneW;
        int y = p.y * imgH / paneH;
        int c = img.getRGB(x, y);
        this.setToolTipText(x + "," + y + ": "
            + String.format("%08X", c));
    }

    @Override
    public void mouseDragged(MouseEvent e) {
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new Grid("Tree.closedIcon"));
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }
}