想要一种用于像素编辑器的网格 [英] Wanting a type of grid for a pixel editor

查看:35
本文介绍了想要一种用于像素编辑器的网格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在尝试开发一个基本的像素编辑器应用程序来积累我的 Java 编程经验.我正在设计它,以便用户有多种颜色选项,他们单击一个选项,然后他们可以拖动网格中的单元格并更改颜色(就像典型的图像编辑器一样,但每个网格都有某种对齐方式单元格)

知道什么 Java 组件能够在 Java 中实现这种类型的网格吗?

我曾想过每个单元格都是一个 JButton,但这似乎效率极低,而且我认为如果不单独单击每个单元格(按钮),就不可能更改每个单元格(按钮)的颜色.

感谢任何帮助.

解决方案

几百个组件很尴尬.获得大像素的一种简单方法是使用 drawImage() 并缩放鼠标坐标,如

import java.awt.Dimension;导入 java.awt.EventQueue;导入 java.awt.Graphics;导入 java.awt.Graphics2D;导入 java.awt.Point;导入 java.awt.event.MouseEvent;导入 java.awt.event.MouseMotionListener;导入 java.awt.image.BufferedImage;导入 javax.swing.Icon;导入 javax.swing.JFrame;导入 javax.swing.JPanel;导入 javax.swing.UIManager;/** @see http://stackoverflow.com/questions/2900801 */公共类 Grid 扩展 JPanel 实现 MouseMotionListener {私有最终 BufferedImage img;私有 int imgW、imgH、paneW、paneH;公共网格(字符串名称){超级(真);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);}@覆盖受保护的无效paintComponent(图形g){paneW = this.getWidth();paneH = this.getHeight();g.drawImage(img, 0, 0, paneW, paneH, null);}@覆盖public void mouseMoved(MouseEvent e) {点 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));}@覆盖public void mouseDragged(MouseEvent e) {}私有静态无效创建(){JFrame f = new JFrame();f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.add(new Grid("Tree.closedIcon"));f.pack();f.setVisible(true);}公共静态无效主(字符串 [] args){EventQueue.invokeLater(new Runnable() {@覆盖公共无效运行(){创建();}});}}

I am currently trying to develop a basic pixel editor application to build up my programming experience with Java. I am designing it so the user has several colour options on, they click on an option and then they can drag over the cells in the grid and they change colour (like a typical image editor, but with a sort of snap on to each grid cell)

Any idea of what Java component, if any, is able to implement this type of grid in Java?

I had thought of each cell being a JButton, but this seemed terribly inefficient and I don't think it would be possible to change the colour of each cell(button) with out individually clicking on each one.

Any help appreciated.

解决方案

More than a few hundred components is awkward. One easy way to get big pixels is to use drawImage() and scale the mouse coordinates as shown here and here. Here's a simple example.

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

这篇关于想要一种用于像素编辑器的网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆