如何使用透明JFrame上的paintComponent重置图形? [英] How to reset graphics with paintComponent on transparent JFrame?

查看:226
本文介绍了如何使用透明JFrame上的paintComponent重置图形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Usually when I want to make animation, I reset all the graphic screen by drawing rectangle:

@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透明?

After I drawed the Rect I can draw the animation on empty screen so the animation will move instead of spread. Right now I want to draw animation on Transparent JFrame. How can I empty the component from Precedings drawings, and still keep the JFrame transparent?

推荐答案

  1. 确保您的组件不透明
  2. 要使透明度发挥作用,您无需在paintComponent()中做任何事情(特别是不用WHITE填充矩形)
  3. 每当要重置所有内容时,请设置标志或条件并调用repaint().在paintComponent()中,检查该标志或条件,如果为true,则不要绘制任何内容.
  1. Make sure your components are non-opaque
  2. For the transparency to work, you don't need to do anything in the paintComponent() (especially not filling a rectangle with WHITE)
  3. Whenever you want to reset everything, set a flag or a condition and invoke repaint(). In the paintComponent(), check for that flag or condition and if true, don't paint anything.

这是一个半透明框架的小演示,该框架在鼠标移动到的任何地方都画了一条线.每当您单击框架时,它都会删除所有内容.

Here is a small demo of a semi-transparent frame which paints a line everywhere your mouse goes. Whenever you click on the frame, it removes everything.

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

    }

}

这篇关于如何使用透明JFrame上的paintComponent重置图形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆