想要一个像素编辑器的网格类型 [英] Wanting a type of grid for a pixel editor

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

问题描述

我目前正在尝试开发一个基本的像素编辑器应用程序,以增强我对Java的编程经验。我正在设计它,所以用户有几个颜色选项,他们点击一个选项,然后他们可以拖动网格中的单元格,他们改变颜色(就像一个典型的图像编辑器,但有一种捕捉到每个网格单元)



任何有关Java组件的内容(如果有的话)都可以在Java中实现这种类型的网格?

我曾想过每个单元格都是JButton,但这看起来非常低效,我不认为可以在单独单击每个单元格(按钮)时更改它们的颜色。



任何帮助表示赞赏。

解决方案

超过几百个组件很尴尬。获得大像素的一个简单方法是使用 drawImage()并相应地缩放鼠标坐标。这里有一个简单的例子。



  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;
$ b $ ** @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);
图标图标= 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));

$ b @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(){
$ b $ @Override
public void run(){
create();
}
});
}
}


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 accordingly. 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天全站免登陆