java - 半透明的内部框架-这在java中可能吗?

标签 java swing jinternalframe translucency

有什么办法可以让 JInternalFrame 使用 swing 制作半透明吗?

我发现的只是 JFrame 的选项(不是内部选项),这不是我需要的。

最佳答案

您应该能够使用JLayer。您可以从布局开始,绘制一个完全不透明的图层,其颜色与桌面 Pane 的背景颜色相同。然后更改 alpha 值以接近单元格,直到完全透明。

请参阅 Swing 教程中 How to Decorate Components With the JLayer Class 的部分了解更多信息和透明绘画示例。

如果您只关心背景,您可以使用Alpha Container使用透明组件时:

JPanel content = new JPanel( new BorderLayout() );
content.setBackground( new Color(0, 0, 0, 0) );
internalFrame.setContentPane(new AlphaContainer(content));
internalFrame.setOpaque(false);

然后,您可以将内容面板的 Alpha 值更改为所需的透明度。

编辑:

这里可以尝试对内部框架及其组件的透明度进行动画处理:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class TransparentInternalFrame extends JInternalFrame implements ActionListener
{
    static int openFrameCount = 0;
    static final int xOffset = 30, yOffset = 30;
    private float alpha = 0.0f;
    private Timer timer = new Timer(500, this);

    public TransparentInternalFrame()
    {
        super("Document #" + (++openFrameCount), true, true, true, true);
        setSize(300,300);
        setLocation(xOffset * openFrameCount, yOffset * openFrameCount);
        setVisible( true );
    }

    @Override
    public void paint(Graphics g)
    {
        g.setColor( getDesktopPane().getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());

        Graphics2D g2 = (Graphics2D)g.create();
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        super.paint(g2);
    }

    public void showFrame()
    {
        timer.start();
    }

    public void hideFrame()
    {
        alpha = 0.0f;
        repaint();
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        alpha += .05f;
        alpha = Math.min(1.0f, alpha);
        System.out.println(alpha);

        if (alpha >= 1.0f)
            timer.stop();

        repaint();
    }

    private static void createAndShowGUI()
    {
        JDesktopPane desktop = new JDesktopPane();
        desktop.setBackground( Color.YELLOW );

        TransparentInternalFrame tif = new TransparentInternalFrame();
        desktop.add( tif );
        tif.add(new JButton("Hello"), BorderLayout.PAGE_START);

        JButton show = new JButton( "Show Internal Frame" );
        show.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                tif.showFrame();
            }
        });

        JButton hide = new JButton( "Hide Internal Frame" );
        hide.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                tif.hideFrame();
            }
        });

        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(show, BorderLayout.PAGE_START);
        frame.add(desktop);
        frame.add(hide, BorderLayout.PAGE_END);
        frame.setLocationByPlatform( true );
        frame.setSize(500, 500);
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

关于java - 半透明的内部框架-这在java中可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31475282/

相关文章:

java - File.createNewFile() 给出 java.io.IOException : Permission denied

java - 在执行时将 JInternalFrame 添加到 JDesktopPane

java - Java的HashMap会悄然溢出吗?

java - 如何在 AIX 中运行 jar 文件?

java - 使用 Swing Timer 临时隐藏通知

java - 无法获取隐藏的 JTable 列

java - CubicCurve2D 连接两个 JInternalFrame 实例

java - 从 Java Web 应用程序内存中清理无效 session 的简单方法

java - 从 jtabbedpane 中的组件 jlabel 获取标题