如何使透明的jframe可调整大小?

时间:2015-05-09 14:57:37

标签: java swing jframe transparent

这是我的代码:

package trialruns;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class TransparentFrame extends JFrame
{
  JButton b1;
  public TransparentFrame()
  {
    setTitle("Transparent Frame Demo");
    setSize(400,400);
    setLayout(new GridBagLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setUndecorated(true);
    setVisible(true);
    setResizable(true);
    setOpacity(0.4f);
  }

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

问题是如果我setOpacity< 1.0我得到一个错误:

    The frame is decorated at java.awt.Frame.setOpacity(Frame.java:960)

如果我做了setUndecorated(true)那么我就无法调整Jframe的大小

我需要能够调整透明的JFrame

我还需要能够访问透明框架下的文件夹 我的意思是,如果透明窗口位于桌面上,并且我想打开放置在窗口下的特定文件夹,那么我应该能够在不使jframe最小化的情况下这样做。

有没有办法做到这一点?

我在网上搜索但无法找到合适的解决方案。

2 个答案:

答案 0 :(得分:3)

帧的大小由帧本身处理。当您删除边框装饰时,您将失去调整大小功能。

因此,您需要自己管理帧的大小调整。查看Component Resizer一个允许您调整任何组件大小的类。

您的代码更改为:

//setResizable(true); // not needed as this is the default anyway
setOpacity(0.4f);
new ComponentResizer( this );
  

但是可以保持边框不透明

是的,但你只能获得Swing装饰边框,而不是平台边框和装饰:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class TransparentFrame2 extends JFrame
{
  public TransparentFrame2()
  {
    setTitle("Transparent Frame Demo");
    setUndecorated(true);
    getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
    setBackground( new Color(0, 0, 0, 0) );

    setSize(400,400);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
  }

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

此外,仍然无法访问框架背后的内容

是的,但您需要完全透明。如果不使用完全透明,则鼠标事件将传递给框架,而不是框架下方的组件。

如果你是半透明的,那么理论上你可以在框架中添加一个MouseListener来拦截MouseEvent。然后你可以使你的框架不可见。然后,您可以使用Robot生成一个新的MouseEvent,现在将其分派到屏幕上。您接下来将使用frameOctScreen(...)方法来从帧坐标转换鼠标点。我从未尝试过这种方法。

答案 1 :(得分:2)

试试这个..为我工作..

import java.awt.*;
import static java.awt.GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT;
import javax.swing.*;

class TransparentFrame extends JFrame {

    JButton b1;

    public TransparentFrame() {
        setTitle("Transparent Frame Demo");
        setSize(400, 400);
        setAlwaysOnTop(true);
        setLayout(new GridBagLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(true);
        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                if (g instanceof Graphics2D) {
                    final int R = 255;
                    final int G = 255;
                    final int B = 255;

                    Paint p =
                        new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0),
                            0.0f, getHeight(), new Color(R, G, B, 0), true);
                    Graphics2D g2d = (Graphics2D)g;
                    g2d.setPaint(p);
                    g2d.fillRect(0, 0, getWidth(), getHeight());
                }
            }
        };
        setContentPane(panel);
        JButton button = new JButton("Button");
        setBackground(new Color(0,0,0,0));
        panel.add(button);
    }

    public static void main(String args[]) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        boolean isPerPixelTranslucencySupported = gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
        //If translucent windows aren't supported, exit.
        if (!isPerPixelTranslucencySupported) {
            System.err.println("PerPixel Translucency is not supported");
            System.exit(0);
        }

        JFrame.setDefaultLookAndFeelDecorated(true);

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TransparentFrame tw = new TransparentFrame();
                tw.setVisible(true);
            }
        });
    }
}

引自this