【问题标题】:Wanting a type of grid for a pixel editor想要一种用于像素编辑器的网格
【发布时间】:2011-02-23 10:54:53
【问题描述】:

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

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

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

任何帮助表示赞赏。

【问题讨论】:

  • 您可能想查看此链接。基本概念始终很重要且非常有用。 java.sun.com/docs/books/tutorial/uiswing
  • 嘿,您的像素编辑器有什么进展吗?我正在尝试自己创建一个。你有它在 GIT 中心或任何其他公共 repo 上吗?
  • 对不起,何塞,恐怕我不久前就摆脱了它:(

标签: java grid mouse


【解决方案1】:

一种选择是使用大的画布,并在其上拦截事件。在 paint(g) 方法中绘制任何你需要的东西。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2016-08-06
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多