假设我想让JPanel%20的不透明度可见?我不是指setOpaque(绘制或不绘制)或setVisible(显示或隐藏)......我的意思是让它透视JPanel ..你知道吗?
这可能吗?
我想使用ScrollPane在其视口中显示图像,并在图像上还有一个网格(或框,或任何其他类型的注册/位置标记)覆盖.滚动时我需要叠加层保持固定(意味着图像似乎在叠加层下"移动").我将以固定速率在视口中滚动视图以提供平滑运动,并且叠加将提供对视口内某个位置的引用.从概念上讲,考虑在视口中滚动的大型地图,以及具有不移动的矩形的视口(相对于视口本身),该矩形标记可以基于某些用户动作放大的区域.
我假设(但尚未确认)ScrollPane实现有效地处理View的渲染(来自后备存储,不必为每个新的部分曝光重新绘制整个View(甚至ViewPort)),因此不希望覆盖paint()方法.
我看过LayerPane,虽然没有掌握它,但似乎这是一种蛮力的方法.ScrollPane是SplitPane的一个组件,将被移动/调整大小.我希望我必须使用绝对定位手动维护ViewPort和LayerPane之间的正确关系.我远不是GUI设计和实现方面的专家,而且我确信我缺少从有经验的人会知道的明显到模糊和优雅的可能性.
我愿意接受任何建议,而不仅仅是我开始的道路.我是否(我可以)在我的SplitPane中添加JPanel作为一个组件,然后在LayerPane的不同图层上添加一个LayerPane到包含我的ScrollPane和覆盖(另一个JPanel)的那个?ScrollPane中是否有功能直接支持此功能?我查看了Java Swing教程和API文档,但还没有看到任何内容.
谢谢.
更新:
感谢您的链接,trashgod.这比我预期的要容易得多.不需要LayerPane,GlassPane,基于xor的合成......我不知道为什么我没有尝试重写JViewport.paint()来绘制我的叠加层 - 但是使用下面的代码我验证了概念将给我我正在寻找的东西.只需使用JViewport的子类,它就可以完成我想要的操作(在这种情况下,当图像在下面滚动时,在Viewport的中心覆盖一个矩形).我不是GUI专家,Java API非常广泛; 我不知道你们怎么把这一切都放在脑海里 - 但是谢谢!
class MyViewport extends JViewport {
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.BLACK);
g2.drawRect(getWidth()/4,getHeight()/4,getWidth()/2,getHeight()/2);
}
}
Run Code Online (Sandbox Code Playgroud) 是的,这个问题无处不在.但是所有(工作)解决方案都使用受限制的AWTUtilities工具包.
所以.我只想控制窗口的不透明度.无需塑造或不整洁.只是一个透明的contentPane(简单)和透明的JFrame背景(非常困难).
我可以发誓我昨天得到了正确的组合,但现在我似乎无法重现它.还有一些解决方案没有使用AWTUtilities,但它们不起作用......有人有一个很好的解决方案吗?
我失败代码的一个例子:
public static void main(String[] args) {
JFrame test = new JFrame();
test.setSize(400, 400);
test.setLocationRelativeTo(null);
test.setUndecorated(true);
test.setBackground(new Color(0, 0, 0, 0));
test.getContentPane().setBackground(new Color(0,0,0,0));
test.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)
但这只是一个白色的方块.关闭但没有雪茄.我也尝试重写绘制方法,有人在说丢弃alpha通道的东西,但这使它变黑(当然).所以...... Stack Overflow就是这样.
如果有一个完全回答这个问题的骗局,请指出我,我会马上删除.
更新 评论中的每个请求,这是我如何到达这里的历史记录:
每个人到达的第一个环节是如何创建半透明和形状的窗户. 这里有几行类似于"......半透明的框架,不透明度为75%".所以...看起来它们的定义是相同的,至少在那篇文章中.不幸的是他们使用图书馆.
我可以追逐的几个链接:
在http://www.java-gaming.org/index.php?topic=24635.0上报告了一个不起作用的"工作"解决方案,这显示了一些希望,但我无法使其正常工作.
http://techgearup.wordpress.com/2008/09/19/transparent-jframe-background/是一种使用屏幕截图的hackish方式,并且在其他一些地方也是重复的.
这个例子编译得很好.你可以从运行它看到我面临的问题.我希望JPanels直接在桌面上绘制,而没有可见的JWindow内容窗格.我还需要一个JScrollpane才能看到,以便横向移动JPanel数组!
感谢任何帮助.
/*
* SSCE.java
* Short Self Contained Example
*
* Problem: Cant make the containers scrollpane non-opaque! (ie. transparent)
*/
package fb;
import com.sun.awt.AWTUtilities;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import javax.swing.BorderFactory;
import javax.swing.JEditorPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JWindow;
import javax.swing.ScrollPaneConstants;
/**
*
* @author Aubrey
*/
public class SSCE {
JWindow w = new JWindow();
Container c = w.getContentPane();
JPanel[] ps;
Toolkit toolkit = Toolkit.getDefaultToolkit ();
Dimension dim = toolkit.getScreenSize();
int width …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在Java中分层ImageIcons.我将使用GIF图像,并将有一个ImageIcons网格代表我的JPane的"背景".
当某个条件成立时,我需要能够在另一个图像的顶部添加一个透明的图像.
此致,杰克亨特