【问题标题】:I'd like to draw pixels on a window with mouse input我想用鼠标输入在窗口上绘制像素
【发布时间】:2011-09-27 02:03:37
【问题描述】:

我已经花了好几天的时间来寻找一种通过鼠标捕获在 java 中将像素绘制到窗口的方法。我正在寻找一些我可以插入的框架。它似乎很简单......任何帮助将不胜感激。

(编辑) 这是一些无效的代码。

public class Base extends JPanel implements MouseMotionListener {

    public static void main(String[] args) {
        new Base();
    }

    final static int width = 800;
    final static int height = 600;
    BufferedImage img;
    Base() {
        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
        JFrame frame = new JFrame();
        frame.addMouseMotionListener(this);
        frame.add(this);
        frame.setSize(width, height);
        frame.setEnabled(true);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void mouseDragged(MouseEvent e) {
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        Graphics g = img.getGraphics();
        g.drawRect(1, 1, width - 2, height - 2);
        g.dispose();
        repaint();
    }
    @Override 
    public void paintComponent(Graphics g) {
         g.drawImage(img, 0, 0, null);
    }

}

【问题讨论】:

标签: java window mouse pixel


【解决方案1】:

见代码中的 cmets。

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

public class Base extends JPanel implements MouseMotionListener {

    public static void main(String[] args) {
        new Base();
    }

    final static int width = 400;
    final static int height = 300;
    BufferedImage img;
    Base() {

        img = new BufferedImage(width, height, 
            BufferedImage.TYPE_INT_ARGB_PRE);
        // do in preference to setting the frame size..
        setPreferredSize(new Dimension(width, height));
        JFrame frame = new JFrame();
        this.addMouseMotionListener(this); // INSTEAD OF THE FRAME
        frame.add(this);
        //frame.setSize(width, height);  DO INSTEAD...
        frame.pack();
        //frame.setEnabled(true);  REDUNDANT
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // good call!
    }

    @Override
    public void mouseDragged(MouseEvent e) {
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        Graphics g = img.getGraphics();
        g.setColor(Color.RED);  // SET A COLOR
        g.drawRect(1, 1, width - 2, height - 2);

        // DO SOMETHING UGLY
        g.setColor(Color.blue);
        Point p = e.getPoint();
        g.fillOval(p.x,p.y,5,5);

        g.dispose();
        repaint();
    }
    @Override
    public void paintComponent(Graphics g) {
         g.drawImage(img, 0, 0, null);
    }
}

【讨论】:

    【解决方案2】:

    使用要在其上绘制的本地 BufferedImage。添加一个 MouseMotionListener 并实现mouseDragged(MouseMotionEvent evt) 方法。在该方法中,通过执行以下操作在 BufferedImage 上绘制:

    // Assume img is your BufferedImage
    Graphics g = img.getGraphics();
    g.drawRect(evt.getX()-1, evt.getY()-1, 3, 3);
    g.dispose();
    // repaint your swing component
    repaint();
    

    在你重写的paintComponent(Graphics g) 方法中,像这样绘制:

    g.drawImage(img, 0, 0, null);
    

    像这样初始化你的 BufferedImage:

    img = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
    // Assuming `this` is your swing component
    

    【讨论】:

    • 为什么是BufferedImageJPanel 默认是双缓冲的。
    • 我已经尝试过您的回答并将您的输入添加到最初的问题中,但无法使其正常工作。
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多