Java 在Windows 10中是否不可能使用透明JFrame背景?
我有一个未装饰的JFrame中的JPanel。我想给JPanel画一个图像。当图像包含透明像素时,我希望这些像素是“透明的”,以便您可以看到窗口后面的任何东西 我所有的研究都告诉我,我应该Java 在Windows 10中是否不可能使用透明JFrame背景?,java,swing,windows-10,Java,Swing,Windows 10,我有一个未装饰的JFrame中的JPanel。我想给JPanel画一个图像。当图像包含透明像素时,我希望这些像素是“透明的”,以便您可以看到窗口后面的任何东西 我所有的研究都告诉我,我应该 myJFrame.setUndecorated(true); myJFrame.setBackground(new Color(0,0,0,0)); myJPanel.setOpaque(false); ,但只要我的JFrame的背景色的alpha不是255,我的JPanel就不再被吸引了。因此,根据我有限
myJFrame.setUndecorated(true);
myJFrame.setBackground(new Color(0,0,0,0));
myJPanel.setOpaque(false);
,但只要我的JFrame的背景色的alpha不是255,我的JPanel就不再被吸引了。因此,根据我有限的测试,它在Windows 10上似乎运行良好 为了确定这一点,我使用
JLabel
做了一个测试
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TestPane extends JPanel {
public TestPane() throws IOException {
BufferedImage img = ImageIO.read(...);
setOpaque(false);
setBorder(new LineBorder(Color.RED));
setLayout(new BorderLayout());
add(new JLabel(new ImageIcon(img)));
}
}
}
这表明问题在代码中的某个地方,您没有向我们展示。考虑提供一个说明你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混淆并获得更好的响应不知道Windows 10,但您所描述的(在您描述的有限范围内)在Linux w/Java 8上适用于我。也许你可以把你的代码充实到一个新的版本?你不应该需要超过30行。@JohnBollinger我严格按照我在另一个问题的答案中找到的一个例子来做,突然它就起作用了。所以我想找出我是怎么做的,使它不起作用的。@JohnBollinger我想我发现了一些东西。显然,您不能直接绘制到JPanel(使用它的
getGraphics()
),但您可以覆盖paintComponent()
,将图像绘制到JPanel,您可以将图像存储在扩展JPanel的类中,并更改该图像,然后调用myJPanel.repaint()代码>。是的,如果要在JComponent
上执行自定义绘制,则应在其paintComponent()
方法的范围内执行。作为此类工作的挂钩是该方法用途的一个重要方面。通过这种方式接收的Graphics
已正确配置,而通过调用getGraphics()
获得的图形可能未正确配置。你可以考虑在这些和其他重要的细节上提神;这里有一个很好的资源:。我可以问一下你从哪里得到这些很酷的图片吗?1+对于那些好的examples@JoFelix可能你做错了什么,我想在这种情况下没有必要调用repaint()
。。。提供一个示例来说明这一点issue@JoFelix根据我的示例,除非在制作帧后更新图像,否则不会visible@Frakcool他们来自网络漫画megatokyo,你可以搜索异常的艺术more@JoFelix我不知道你想做什么,因为你没有解释你想实现什么以及你是如何实现的,所以我只能猜测,不要假设我们知道你在做什么。根据您试图执行的操作,您可能还需要调用revalidate,这是更新swing UI的常见做法,因此您的问题根本不在于使用透明窗口:P
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TestPane extends JPanel {
public TestPane() throws IOException {
BufferedImage img = ImageIO.read(...);
setOpaque(false);
setBorder(new LineBorder(Color.RED));
setLayout(new BorderLayout());
add(new JLabel(new ImageIcon(img)));
}
}
}