Difference between Graphics object of getGraphics and paintComponent

后端 未结 1 1471
天命终不由人
天命终不由人 2021-01-16 11:19

If I\'m working with a JPanel, what\'s the difference between the Graphics object returned by getGraphics, and the Graphics object that is passed in paintComponent method?

1条回答
  •  太阳男子
    2021-01-16 12:00

    getGraphics

    • Can be null
    • Is a "snap shot" of the last paint process
    • Anything painted to it will be lost on the next paint cycle

    You should avoid using getGraphics and simply use what is past to the paintComponent method.

    In theory, there is no difference between them, but if you want what you have painted to survive between repaints, then you should be using paintComponent

    Updated with example

    Without an example code to go by I'm guessing...but...

    enter image description here

    Basically, this has a JPanel that acts as the primary "canvas" that draws an image and, when set, a Rectangle which acts as the selection.

    It uses a second class as the MouseListener to actually make the decisions about what to paint

    import java.awt.AlphaComposite;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Composite;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class MouseSelection {
    
        public static void main(String[] args) {
            new MouseSelection();
        }
    
        public MouseSelection() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    ImagePane imgPane = new ImagePane();
                    new MouseHandler(imgPane);
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(imgPane);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class MouseHandler    extends MouseAdapter {
    
            private ImagePane imgPane;
    
            private Point clickPoint;
    
            public MouseHandler(ImagePane imgPane) {
                this.imgPane = imgPane;
                imgPane.addMouseMotionListener(this);
                imgPane.addMouseListener(this);
            }
    
            @Override
            public void mousePressed(MouseEvent e) {
                imgPane.clearSelection();
                clickPoint = e.getPoint();
            }
    
            @Override
            public void mouseReleased(MouseEvent e) {
                clickPoint = null;
            }
    
            @Override
            public void mouseDragged(MouseEvent e) {
                if (clickPoint != null) {
                    Point dragPoint = e.getPoint();
    
                    int x = Math.min(clickPoint.x, dragPoint.x);
                    int y = Math.min(clickPoint.y, dragPoint.y);
                    int width = Math.max(clickPoint.x, dragPoint.x) - x;
                    int height = Math.max(clickPoint.y, dragPoint.y) - y;
    
                    imgPane.setSelection(new Rectangle(x, y, width, height));
    
                }
            }
    
        }
    
        public class ImagePane extends JPanel {
    
            private BufferedImage img;
            private Rectangle selection;
    
            public ImagePane() {
                try {
                    img = ImageIO.read(new File("C:\\hold\\thumbnails\\issue459.jpg"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            @Override
            public Dimension getPreferredSize() {
                return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(), img.getHeight());
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                if (img != null) {
                    int x = (getWidth() - img.getWidth()) / 2;
                    int y = (getHeight() - img.getHeight()) / 2;
                    g2d.drawImage(img, x, y, this);
                }
                if (selection != null) {
    
                    Color color = UIManager.getColor("Table.selectionBackground");
                    g2d.setColor(color);
                    Composite comp = g2d.getComposite();
                    g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
                    g2d.fill(selection);
                    g2d.setComposite(comp);
                    g2d.draw(selection);
    
                }
                g2d.dispose();
            }
    
            protected void clearSelection() {
                selection = null;
                repaint();
            }
    
            protected void setSelection(Rectangle rectangle) {
                selection = rectangle;
                repaint();
            }
        }
    
    }
    

    0 讨论(0)
提交回复
热议问题