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

Translucent internal frames - is that possible in java?

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

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

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

有关详细信息和透明绘画示例,请参阅 How to Decorate Components With the JLayer Class 上的 Swing 教程部分。

如果您只关心背景,您可以在使用具有透明度的组件时使用 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();
            }
        });
    }
}