繁体   English   中英

使用repaint()使用参数调用paintComponent()

[英]Calling paintComponent() with parameters using repaint()

我对使用Java图形非常陌生,因此只需询问是否需要其他信息即可:)

我试图根据鼠标在屏幕上的单击位置绘制形状。 因此,我需要将单击位置的x和y坐标传递给paintComponent()方法,以便它知道在何处绘制形状。

public void mouseClicked(MouseEvent e) {
    System.out.println("Adding Shape");
    repaint();
}

class CanvasDrawArea extends JPanel{
    //this should run when the program first starts
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        canvas.setBackground(CANVAS_COLOR);
    }

    //here is where the question is
    public void paintComponent(Graphics g, int x, int y){
        super.paintComponent(g);
        g.fillRect(x, y, RECTANGLE_WIDTH, RECTANGLE_HEIGHT);
    }
}

基本上,我试图通过使一个在程序启动时通过调用repaint() / pack()方法正确运行的方法正确运行,而在我给它提供x和y坐标时运行的方法正确地重载paintComponent。 但是,我不确定如何传递x和y参数,因为无法在repaint()方法中传递它们。

  1. 您永远不需要调用paintComponent或直接paint ,这些在需要时由重新绘制管理器自动调用...
  2. 创建java.util.List并将每个鼠标单击的Point存储在其中,完成此操作后,从mouseClicked方法调用repaint
  3. paintComponent(Graphics)方法中,遍历点List并绘制所需的形状。

作为一个简单的例子...

多蒂

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Dotty {

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

    public Dotty() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new DottyPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DottyPane extends JPanel {

        private List<Point> points;

        public DottyPane() {
            points = new ArrayList<>(25);
            addMouseListener(new MouseAdapter() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    points.add(e.getPoint());
                    repaint();
                }

            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.RED);
            for (Point p : points) {
                g2d.fillOval(p.x - 5, p.y - 5, 10, 10);
            }
            g2d.dispose();
        }

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM