【问题标题】:Creating a Blurred Transperent JPanel [closed]创建一个模糊透明的 JPanel [关闭]
【发布时间】:2016-10-09 10:15:13
【问题描述】:

我正在尝试为 JLabel 创建一个子类,我将其命名为 BlurPanel。我希望该类像任何普通的摇摆容器一样工作,只是它必须默认具有透明背景,即 (setOpaque(false)) 并且它必须模糊父框架的背景。到目前为止,我已经设法模糊了 BufferedImages 并调整了它们的大小,但是当使用标准的摆动布局管理器时,我很难将帧图片裁剪到 BlurPanels 位置。有没有人有一个很好的策略来做到这一点?或许不用复制底层图片也能做到?

【问题讨论】:

标签: java swing awt bufferedimage graphics2d


【解决方案1】:

使用GlassPane卢克

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.WindowConstants;

/**
 * Glass pane used to blur the content of the window.
 *
 * @author SMedvynskyy
 */
@SuppressWarnings("serial")
public class SplashGlassPane extends JPanel implements FocusListener {

    /**
     * Creates new GlassPane.
     */
    public SplashGlassPane() {
        addMouseListener(new MouseAdapter() {});
        addMouseMotionListener(new MouseAdapter() {});
        addFocusListener(this);
        setOpaque(false);
        setFocusable(true);
        setBackground(new Color(0, 0, 0, 190));
    }

    @Override
    public final void setVisible(boolean v) {
        // Make sure we grab the focus so that key events don't go astray.
        if (v) {
            requestFocus();
        }
        super.setVisible(v);
    }

    // Once we have focus, keep it if we're visible
    @Override
    public final void focusLost(FocusEvent fe) {
        if (isVisible()) {
            requestFocus();
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final void paint(Graphics g) {
        final Color old = g.getColor();
        g.setColor(getBackground());
        g.fillRect(0, 0, getSize().width, getSize().height);
        g.setColor(old);
        super.paint(g);
    }

    @Override
    public void focusGained(FocusEvent fe) {
        // nothing to do
    }

    public static void main(String[] args) {
        final JFrame frm = new JFrame("Test blurring");
        frm.add(new JTextField("It's first component"), BorderLayout.NORTH);
        frm.add(new JTextField("It's second component"), BorderLayout.SOUTH);
        final JButton btn = new JButton("Start blur");
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                frm.getGlassPane().setVisible(true);
                final Timer t = new Timer(5000, new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frm.getGlassPane().setVisible(false);
                    }
                });
                t.setRepeats(false);
                t.start();
            }
        });
        frm.add(btn);
        frm.setSize(500, 400);
        frm.setGlassPane(new SplashGlassPane());

        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }
}

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多