如何在Jpanel区域内制作半透明的JPanel [英] How to make a translucent JPanel within the region Jpanel

查看:149
本文介绍了如何在Jpanel区域内制作半透明的JPanel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想制作一个半透明的 JPanel ,我可以选择x坐标,y坐标,宽度和高度。我找到了一些填充其父容器的半透明 JPanel 的材料,但我不需要这种效果。我需要一个半透明的 JPanel ,其位置可以在父容器中指定,这样只有这个区域是半透明的,而父容器中的其他区域是不透明的。我试过这段代码,但是不正确。结果区域小于我想要的区域。有什么问题,或者我怎么能得到这种效果?

I want to make a translucent JPanel for which I can choose the x-coordinate, y-coordinate, width and height. I have found some material that made a translucent JPanel that filled its parent container, but I don't need this effect. I need a translucent JPanel whose position can be specified in the parent container, such that only this area is translucent, while others in the parent container are opaque. I tried this code but it is incorrect. The resultant area is smaller than the area I intend. What is wrong, or how I can get this effect?

public class TranslucentJPanel extends JPanel {

    private float transparency;

    public TranslucentJPanel(){
    }



    /**set the transparency
     * 
     * @param transparency:the transparency you want to set
     * 
     * @return void
     */
    public void setTransparent(float transparency) {
        this.transparency = transparency;
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);

        Graphics2D graphics2d = (Graphics2D) g.create();
        graphics2d.setComposite(AlphaComposite.SrcOver.derive(transparency));

        graphics2d.fill(getBounds());
        graphics2d.dispose();
    }
}


推荐答案

所以,立即想到两件事......

So, two things come to mind immediately...

首先,不要使用 getBounds Grapghics 上下文已经转换为组件 x / y 位置,所以你加倍了。相反,只需使用 0x0 并提供宽度高度 ,类似......

First, don't use getBounds, the Grapghics context is already translated to the components x/y position, so you're doubling that up. Instead, simply use 0x0 and provide the width and height, something like...

graphics2d.fillRect(0, 0, getWidth(), getHeight());

另外,请记住,大多数Swing组件默认是不透明的,包括 JList JScrollPane 并且它是 JViewport ,如果你需要将它们设置为透明希望他们能够完全看透。

Also, remember, most Swing components are opaque by default, this includes the JList, JScrollPane and it's JViewport, you need to set these to be transparent if you want them to be see through at all.

此外, JList 的默认渲染器也使用渲染器如果你想让物品透明,你需要能够提供自己的物品......

Also, the "default" renderer that the JList uses also renderers it self as opaque, so you need to be able to supply your own if you want the items to be transparent...

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test {

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

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

                DefaultListModel<String> model = new DefaultListModel<>();
                model.addElement("Bananas");
                model.addElement("Apples");
                model.addElement("Pears");
                model.addElement("Grapes");
                model.addElement("Tim Tams");

                JList list = new JList(model);
                list.setCellRenderer(new DefaultListCellRenderer() {

                    @Override
                    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                        setOpaque(isSelected);
                        return this;
                    }

                });
                list.setOpaque(false);
                JScrollPane sp = new JScrollPane(list);
                sp.setOpaque(false);
                sp.getViewport().setOpaque(false);

                TranslucentPane tp = new TranslucentPane();
                tp.setLayout(new GridBagLayout());
                tp.setLayout(new BorderLayout());
                tp.add(sp);

                JFrame frame = new JFrame("Testing");
                frame.setContentPane(new BackgroundPane());
                frame.setLayout(new GridBagLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(tp);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TranslucentPane extends JPanel {

        private float alpha = 0.75f;

        public TranslucentPane() {
            setOpaque(false);
            setBorder(new EmptyBorder(5, 5, 5, 5));
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setComposite(AlphaComposite.SrcOver.derive(alpha));

            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.dispose();
        }

    }

    public class BackgroundPane extends JPanel {

        private BufferedImage background;

        public BackgroundPane() {
            try {
                background = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\MegaTokyo\\thumnails\\megatokyo_omnibus_1_3_cover_by_fredrin-d4oupef.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int x = (getWidth() - background.getWidth()) / 2;
            int y = (getHeight() - background.getHeight()) / 2;
            g.drawImage(background, x, y, this);
        }

    }

}

这篇关于如何在Jpanel区域内制作半透明的JPanel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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