我试图制作重叠的面板,但是在最顶层的面板下面会出现小部件。面板以某种方式对鼠标事件做出反应并重新绘制事件并在顶层上方呈现。例如,这里我有底层有很多按钮和标签,顶层有上/下按钮,这个测试完全不透明(灰色背景):
这使用OverlayLayout
管理器将面板放置在不同的Z级别上。当鼠标悬停在按钮上时,按钮会弹出视图,右侧的标签会自动更新,也会弹出视图。
SSCCE:
public class Temp extends JPanel {
public static void main(String... args) {
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setContentPane(new Temp());
f.setSize(500, 250);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
public Temp() {
super(null);
setLayout(new OverlayLayout(this));
JButton bottom = new JButton("Bottom");
JButton top = new JButton("Top");
bottom.setBounds(100, 50, 200, 100);
top.setBounds(200, 100, 200, 100);
// OverlayLayout adds components from top to bottom.
add(new JPanel(null) {{
setBackground(new Color(175, 150, 125));
add(top);
}});
add(new JPanel(null) {{
add(bottom);
}});
}
}
这基本上就是我现在这样做的方式。在鼠标悬停之后看起来像是这样,但是在悬停时我可以将两个按钮中的任何一个带到另一个上面:
我的问题是,如何以最简单的方式解决这个问题,或者处理此问题的标准方法是什么?也许是非模态无框架的JDialog?我对这个对话框的一个论点是,我不是说用户使用键盘快捷键在屏幕上移动它。
答案 0 :(得分:0)
以及带有向上/向下按钮的顶层,对于此测试(灰色背景)完全不透明:
拥有“不透明”的顶部面板是没有意义的。您将看不到底部面板上的按钮。顶部面板应该是透明的,底部面板应该是您的背景颜色。
我的问题是,如何解决这个问题
如果您指的是当您将鼠标悬停在每个按钮上时ZOrder按钮不断变化,则需要在Temp面板上覆盖以下方法(即使用OverlayLayout
的面板):
@Override
public boolean isOptimizedDrawingEnabled()
{
return false;
}
这基本上说Temp面板可能包含重叠组件,因此每次都需要在适当的ZOrder中重新绘制所有面板。