如何在透明JFrame上使用paintComponent重置图形?

时间:2013-04-12 12:38:33

标签: java swing graphics jframe paint

通常当我想制作动画时,我会通过绘制矩形重置所有图形屏幕:

@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.white);
    g.fillRect(0,0,1000,1000);

    // now im drawing the animation on empty screen
}

绘制完Rect后,我可以在空白屏幕上绘制动画,这样动画就会移动而不是传播。现在我想在透明JFrame上绘制动画。如何从Precedings图纸中清空组件,并保持JFrame透明?

1 个答案:

答案 0 :(得分:2)

  1. 确保您的组件不透明
  2. 要使透明度有效,您无需在paintComponent()中执行任何操作(尤其是不使用WHITE填充矩形)
  3. 每当您想要重置所有内容时,请设置标志或条件并调用repaint()。在paintComponent()中,检查该标志或条件,如果为true,则不要绘制任何内容。
  4. 这是一个半透明框架的小型演示,可以在鼠标移动的任何地方画出一条线。无论何时单击框架,都会删除所有内容。

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class TestTransparentFrame {
    
        private class PaintPanel extends JPanel {
            private List<Point> points = new ArrayList<Point>();
    
            public PaintPanel() {
                setOpaque(false);
                MouseAdapter adapter = new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        points.clear();
                        repaint();
                    }
    
                    @Override
                    public void mouseMoved(MouseEvent e) {
                        points.add(e.getPoint());
                        repaint();
                    }
                };
                addMouseListener(adapter);
                addMouseMotionListener(adapter);
                setBorder(BorderFactory.createLineBorder(Color.GREEN));
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (points.size() > 1) {
                    g.setColor(Color.RED);
                    Point p1 = points.get(0);
    
                    for (int i = 1; i < points.size(); i++) {
                        Point p2 = points.get(i);
                        g.drawLine(p1.x, p1.y, p2.x, p2.y);
                        p1 = p2;
                    }
                }
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(700, 500);
            }
        }
    
        protected void createAndShowGUI() throws MalformedURLException, IOException {
            JFrame frame = new JFrame("Test transparent painting");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setUndecorated(true);
            frame.setBackground(new Color(0, 0, 0, 50));
            frame.add(new PaintPanel());
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        new TestTransparentFrame().createAndShowGUI();
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
    
        }
    
    }