- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,为了解决这个问题,我绝对需要在 swing 应用程序中使用重量级 AWT 组件。我需要他们两个的功能。
任务很简单 - 渲染一个重量级 AWT Canvas(或任何其他元素),直接在其上渲染 OpenGL 场景,然后在其上方显示 UI 的 Swing 按钮。
我的问题是它半途而废。我似乎对 Z 排序没有任何问题。我正在使用 jLayeredPanes,并且我可以在层之间移动 Canvas,它实际上可以工作,弹出到其他元素的顶部或下方。
问题在于透明度。问题是,Swing 元素有 Opaque 参数,当它设置为 false(非不透明)时 - 它基本上应该是透明的,您应该看到它下面的下一个元素。然而,在我的例子中,AWT Canvas 被忽略,您只能看到下一个底层 SWING 元素。
这里有一些屏幕截图。它们取 self 的一个独立测试项目。 Canvas 被拉伸(stretch)到框架的大小,左上角有一个 JLayeredPane 虚拟元素,它是菜单的简化版本。
在第一个屏幕截图中,JLayeredPane 的不透明设置设置为 true,您可以看到它的背景属性设置为蓝色。
在第二个屏幕截图中,一切都完全相同,但不透明设置为 false。不是显示 Canvas 上的任何内容,而是在空的灰色 jFrame 背景中绘制的内容。
最后,在第三个屏幕截图中,我将 Canvas 放入 jPanel 中,而不是将其单独保留。正如您所看到的,通过透明的 jLayeredPane 可以看到面板的橙色,但 Canvas 再次被隐藏。
这是框架布局的代码。我现在不会发布我的渲染/上下文代码
frame = new JFrame("AWT test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setPreferredSize(new Dimension(width, height));
canvas = new Canvas();
canvas.setSize(width,height);
//this part exists only in the third example
JPanel p = new JPanel();
p.setSize(width,height);
p.setBackground(Color.orange);
p.add(canvas);
// third example end
JLayeredPane pane = new JLayeredPane();
JLayeredPane paneMenu = new JLayeredPane();
JButton button = new JButton();
button.setSize(20,20);
paneMenu.setSize(200,200);
paneMenu.add(button, new Integer(1));
paneMenu.setBackground(Color.BLUE);
paneMenu.setOpaque(false); //True for the first example
pane.add(p, new Integer(1)); // canvas for the first two examples
pane.add(paneMenu, new Integer(2));
pane.setOpaque(false);
frame.add(pane);
frame.pack();
frame.setVisible(true);
frame.transferFocus();
有人可以向我解释一下发生了什么事以及如何做我需要做的事情吗?我会再次重复 - 我必须使用重量级组件作为渲染目标。我知道像 JOGL 的 GLPanel 这样的解决方案,它是一个轻量级的 Swing 兼容组件。但我尝试了该方法,性能非常慢,因为它不是直接将其作为上下文目标渲染,而是从内存中读取 FrameBuffer,翻转它,然后将其绘制为 BufferedImage。该路径不适合我将运行的嵌入式系统的有限资源。
c0der 说:请发布最小的可重现示例呃……我不是吗?在这里,如果您愿意,您可以使用完整的 java 类形式,但我实际上更改了一些常量变量。
import javax.swing.*;
import java.awt.*;
public class Main
{
public static void main(String[] args)
{
JFrame frame = new JFrame("AWT test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setPreferredSize(new Dimension(500, 500));
Canvas canvas = new Canvas();
canvas.setSize(500,500);
canvas.setBackground(Color.RED);
//this part exists only in the third example
JPanel p = new JPanel();
p.setSize(500,500);
p.setBackground(Color.orange);
p.add(canvas);
// third example end
JLayeredPane pane = new JLayeredPane();
JLayeredPane paneMenu = new JLayeredPane();
JButton button = new JButton();
button.setSize(20,20);
paneMenu.setSize(200,200);
paneMenu.add(button, new Integer(1));
paneMenu.setBackground(Color.BLUE);
paneMenu.setOpaque(false); //True for the first example
pane.add(p, new Integer(1)); // canvas for the first two examples
pane.add(paneMenu, new Integer(2));
pane.setOpaque(false);
frame.add(pane);
frame.pack();
frame.setVisible(true);
frame.transferFocus();
}
}
一点更新:
我最初怀疑,因为 Swing 元素将所有绘图委托(delegate)给底层重量级元素(在我的例子中为 JFrame),所以发生的情况是框架为自己生成一个单独的frameBuffer,然后显示在 Canvas 之上。 Canvas 本身在这一代中没有得到处理,因此框架“覆盖”了 Canvas 。
事实似乎并非如此。我尝试使 JFrame 未经装饰,所有面板不透明,并显示图片。结果—— Canvas 仍然被“切割”,通过这个洞你可以看到底层的 IDE 菜单。这让我认为在绘图过程中的某个地方, Canvas 本身检测到它被另一个元素遮挡,并且它不需要绘制该区域。因此它会“优化”自身并且不会更新这些像素。
也许我错了。但这是另一个屏幕截图。这与之前的示例相同,但我取出了 3D 渲染,只是尝试显示背景设置为红色的 Canvas。
最佳答案
再次回答我自己的问题。
事实证明我需要做
setComponentMixingCutoutShape(paneMenu, new Rectangle());
用于位于按钮下方的菜单 Pane 。这本质上告诉 java 不要从重量级底层组件中删除该元素。
关于java - Swing 分层 - 透明组件忽略底层 AWT 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59321794/
我有以下功能: function addChange(result, bill) { for (var i=0;i
这是网站: www.wearethefirehouse.com/phasetest 如果您慢慢滚动,您会注意到一旦菜单栏完全不透明,nav li 元素就会全部从 Enzo 300 跳起来(如在没有导航
美好的一天。对于当前的项目,我需要知道数据类型如何表示为字节。例如,如果我使用: long three = 500;var bytes = BitConverter.GetBytes(three);
请解释 JVM 是如何在底层收集 ThreadDump 的。 我不明白它如何收集脱离 CPU 的线程的堆栈跟踪(等待磁盘 IO、网络、非自愿上下文切换)。 例如,linux perf 仅收集有关 on
开始学习 R,如果能帮助我理解 R 如何决定不同向量的类别,我将不胜感激。我初始化 vec <- c(1:6)当我执行 class(vec)我得到“整数”。为什么它不是“数字”,因为我认为 R 中的整
我有一个透明的 UIView,几乎覆盖了整个屏幕。我在顶部留下了 50 像素。它是 View Controller View 的 subview 。 在UIView下面有一个继承自UIView的MyV
我很好奇对象是如何在 Nodejs 中显示的,在本例中是 Promise。使用 console.log(promiseObject) 时,输出的类型为 {状态:待处理} 这对我来说似乎很奇怪,因为在该
当您在 Windows Azure 中使用表服务 API 时,幕后到底在做什么?我想我在某处读到这没有使用 SQL Server。它是否执行哈希表,然后过滤器真的像映射/减少操作一样运行?我对这些东西
如何查看函数 concat 中的代码?它是如何做的?有没有人有代码的副本或在浏览器控制台中查看它的方法? console.dir 不给我访问权限 console.dir(Array.prototype
我是 C++ 的新手,所以如果这个问题的答案显而易见,我深表歉意。 我一直在编写 STL 样式的自定义数据结构,以此来提高我的技能。 (我实际上也确实需要这种结构,但出于学习目的,我有点过分了。) 此
我正在尝试使用 log4j appender 将日志发送到 GrayLog2 (log4j2-gelf)。所以我将我的依赖项添加到我的 pom.xml 配置 log4j2.xml 来配置我的 appe
我正在使用带有 vector 的 priority_queue 作为底层容器。但是我希望堆的大小非常大。我知道动态 vector 容量调整大小的问题。所以我正在寻找方法来为我的priority_que
我有一个 SqlDataAdapter,它填充了 21 行数据(4 列)。驱动它的 sproc 在几秒钟内在 SQL Mgmt Studio 中返回,但 .Fill() 需要 5 分钟。 Ar
我想实现一个屏幕控制按钮,按下它可以作为 GUI 交互的修饰符。 这对于 MouseArea 是不可能的,因为该 API 只能处理一个鼠标区域中的一个触摸点。 该限制不适用于 MultiPointTo
我试图将图像和 div 层置于包含 div 的中心,但到目前为止我无法让它从列的左侧移动。我尝试了几种不同的方法,但就是无法让它移动。即使 margin auto 技巧也不起作用,我怀疑这是因为 bo
需要明确的是,我不是在询问 HDFS 中的权限设置,而是在 ext3 中或在 HDFS 运行于其上的各个数据节点机器上使用的任何文件系统中。 p> 我知道我们设置了 sudo chown hduser
我在服务器上创建了一个枚举,其中手动设置了整数值,而不是默认从 0 开始递增 public enum UserType { Anonymous = 0, Customer = 10,
如果显示框架图像,我们能否使以下 Google map 具有交互性。 Vie
我有一个顶部有自定义状态栏的布局 [在 Apple 的状态栏下方],然后是 UIScrollview 在中间部分从左到右分页,然后我有一个 UIView 底部有一些自定义按钮。一个简单的三 Pane
事情是这样的。我有一个 MVC 操作,在该操作上,我应用了自定义 ActionFilterAttribute 来使反序列化工作。现在,我想要做的是根据在此 View 中设置的 ViewBag.Titl
我是一名优秀的程序员,十分优秀!