Java 如何仅显示JLabel隐藏JFrame或任何较低级别的容器
我想显示JLabel,但想隐藏JFrame border和其他较低级别的容器,如JPanel。 它只是在屏幕上显示 我尝试了窗口透明度,但如果尝试使用窗口不透明度,下面的代码会隐藏所有内容。 降低windowOpacity时,即使是JLabel也会变得模糊。我也尝试使用JPanel,但无法获得准确的输出。 我只希望jdk1.6中有这种行为 我希望JLabel内容正确可见,没有任何不透明度影响,但Backburnd必须完全透明Java 如何仅显示JLabel隐藏JFrame或任何较低级别的容器,java,swing,jframe,transparency,jlabel,Java,Swing,Jframe,Transparency,Jlabel,我想显示JLabel,但想隐藏JFrame border和其他较低级别的容器,如JPanel。 它只是在屏幕上显示 我尝试了窗口透明度,但如果尝试使用窗口不透明度,下面的代码会隐藏所有内容。 降低windowOpacity时,即使是JLabel也会变得模糊。我也尝试使用JPanel,但无法获得准确的输出。 我只希望jdk1.6中有这种行为 我希望JLabel内容正确可见,没有任何不透明度影响,但Backburnd必须完全透明 public class TEST { publi
public class TEST {
public static void main(String[] args) {
JFrame frame = new JFrame("Sanjaal Corps - Windows On Top Demo!");
frame.setSize(400, 100);
frame.setLocation(100, 150);
com.sun.awt.AWTUtilities.setWindowOpacity(frame,0.4f);
frame.setUndecorated(true);
frame.add(new JLabel("TESTING"));
frame.setAlwaysOnTop(true);
frame.setVisible(true);
}
}
我尝试了提供的解决方案
但这里的问题是,如果我们最小化或最大化窗口,然后设置一个恒定的颜色,因此发现它不是最佳解决方案,或者可能说是完美的解决方案。假设您希望显示标签(没有其他内容)的前景,即其文本/图标,您会将框架的不透明度设置为false:
com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);
使用com.sun.**类的常见警告,不幸的是,如果我正确理解您的需求,这是访问java7之前的透明窗口的唯一方法 我通常会在
窗口中添加一个透明面板。这意味着,窗口的透明度属性通常不会影响子组件,例如
一般来说,现在有两种方法可以使窗口透明
在Java7下,只需将其背景色设置为透明即可李>
在Java6(update 10+)下,您需要使用非官方的com.sun.awutilities
类
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.Window;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.lang.reflect.Method;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.LineBorder;
公开课透明课02{
公共静态void main(字符串[]args){
新的透明材料TWINDOW02();
}
公开透明{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
框架。设置未装饰(真实);
set不透明(框,假);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
设置不透明(假);
setLayout(新的BorderLayout());
设置顺序(新的线边框(颜色为红色));
JLabel label=新的JLabel(“如果可以看到我,请单击我”);
label.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
SwingUtilities.windowForComponent(TestPane.this.dispose();
}
});
添加(标签);
}
}
公共静态void setOpaque(窗口,布尔不透明){
String version=System.getProperty(“java.runtime.version”);
if(版本.startsWith(“1.7”)){
窗口背景(新颜色(0,0,0,0));
}否则{
试一试{
Class awtUtilsClass=Class.forName(“com.sun.awt.AWTUtilities”);
如果(awtUtilsClass!=null){
方法Method=awtUtilsClass.getMethod(“setWindow不透明”,Window.class,boolean.class);
调用(null、window、不透明);
}
}捕获(异常扩展){
exp.printStackTrace();
}
}
}
}
为了更快地获得更好的帮助,发布一篇文章。我在main中添加了所有内容,因此现在粘贴了整个类com.sun.awt.AWTUtilities
,它非常脆弱。你说。。“我只希望jdk1.6中有这种行为”,但这在非Oracle JRE中不起作用。顺便说一句,为什么是JDK而不是JRE?你的用户有JDK?很抱歉,这个词选错了,我的意思是只使用jre,是的,我同意jre1.6的rt.jar限制了访问,但我只是想看看它的行为,并想解释一下我到底想要什么。我也尝试过AlphaComposite,但无法满足确切的要求为什么你要浪费我的时间<代码>线程“main”java.awt.IllegalComponentStateException中的异常:框架被修饰
该代码是垃圾代码,而不是您一直运行的任何代码。我重复一遍,为了更快地得到更好的帮助,请发布一条消息。SSCCE应该包括导入,并在此处显示与在此处相同的行为。另外,为了透明,请忽略那些(该死的)com.sun
类,并查看公共API,如或中所示。。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.reflect.Method;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class TransparentWindow02 {
public static void main(String[] args) {
new TransparentWindow02();
}
public TransparentWindow02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
setOpaque(frame, false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setOpaque(false);
setLayout(new BorderLayout());
setBorder(new LineBorder(Color.RED));
JLabel label = new JLabel("Click me if you can see me");
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
SwingUtilities.windowForComponent(TestPane.this).dispose();
}
});
add(label);
}
}
public static void setOpaque(Window window, boolean opaque) {
String version = System.getProperty("java.runtime.version");
if (version.startsWith("1.7")) {
window.setBackground(new Color(0, 0, 0, 0));
} else {
try {
Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities");
if (awtUtilsClass != null) {
Method method = awtUtilsClass.getMethod("setWindowOpaque", Window.class, boolean.class);
method.invoke(null, window, opaque);
}
} catch (Exception exp) {
exp.printStackTrace();
}
}
}
}