这是我的代码:
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最小化的情况下这样做。
有没有办法做到这一点?
我在网上搜索但无法找到合适的解决方案。
答案 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