【发布时间】:2013-10-12 11:02:08
【问题描述】:
我有一个带有 GroupLayout 的 JPanel,里面有 3 个 JLabel。我还有一个隐藏的 JButton。
我在 JPanel 中添加了一个 MouseListener,分别在 mouseEntered 中显示按钮并在 mouseExited 事件中隐藏按钮。
此时,它们是 2 个标签之间的按钮空间,并且它们唯一的按钮使用 setVisible() 显示或隐藏。当 btn 可见时,它下面的标签会向下为按钮腾出空间,如果 btn 被隐藏,它会再次恢复到原来的大小。
我想要什么 - 在 mouseEntered 中,按钮应该显示在标签本身(让它重叠)并且我应该能够点击按钮。这一切都应该非常顺利地发生,没有屏幕闪烁。同样在 mouseExited 中,按钮应该被移除。
我如何做到这一点?谁能帮我这个。
更新 @Andrew,谢谢我尝试使用 JLayeredPane,它确实有效。尽管该按钮未设置为可见假。这是我的 mouseMoved 代码:
public void mouseMoved(MouseEvent e) {
if (e.getComponent() == layeredPane) {
if (! startCustomBtn.isVisible())
startCustomBtn.setVisible(true);
startCustomBtn.setLocation(e.getX()-55, e.getY()-30);
} else {
if (startCustomBtn.isVisible()) {
startCustomBtn.setVisible(false);
revalidate();
}
}
}
JPanel 的布局:
private void layeredLayout() {
layeredPane = new JLayeredPane();
layeredPane.addMouseMotionListener(this);
Insets insets = this.getInsets();
Dimension size = rateLabel.getPreferredSize();
rateLabel.setBounds(insets.left + 45, insets.top + 15, size.width, size.height);
size = imageLabel.getPreferredSize();
imageLabel.setBounds(insets.left + 15, insets.top + 40, size.width, size.height);
size = label.getPreferredSize();
label.setBounds(insets.left + 45, insets.top + imageLabel.getWidth() + 20 , size.width, size.height);
size = startCustomBtn.getPreferredSize();
startCustomBtn.setBounds(insets.left + 45, insets.top + 40 + size.height, size.width, size.height);
layeredPane.add(rateLabel, new Integer(0));
layeredPane.add(imageLabel, new Integer(1));
layeredPane.add(label, new Integer(2));
layeredPane.add(startCustomBtn, new Integer(1), 0);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(layeredPane);
}
奇怪 - 我尝试了带有 null 的布局,FlowLayout,但什么也看不到。尝试使用 BoxLayout 时,组件出现了。
结果:
主屏幕有一个带有 Gridlayout(2, 3) 的 JPanel,并且在每个单元格中都添加了这个 JPanel (MyPanel)。当我从 1 个单元格(即 MyPanel)出来时,该面板的按钮应该被隐藏,这在上面的代码中没有发生。可能是什么原因?我还添加了 revalidate() 和 repaint() 但没有任何效果。 ????
【问题讨论】:
-
虽然我得到了闪烁效果,但我的 java 版本 "1.7.0_25" 您是否尝试过使用 Java 6 来做到这一点?尽管帖子的最后一句话肯定会让人怀疑您到底要做什么? +1 不过,如果我在
mouseEntered/mouseExited方法上使用setVisible(true/false),这确实也在我身边闪烁。已经在一段时间前对其进行了投票:-) -
我想要实现的只是想在带有图标的标签上流畅地显示一个可点击的按钮,而不会受到任何干扰。并单击按钮,应该能够执行某些操作。我曾尝试使用布局(空),但 btn 正在图标下,也无法单击它。所以现在使用 Gridlayout。
-
在网上搜索了很多,我想我必须创建另一个 JPanel 并在其中只添加 JButton。向这个 JPanel 展示一些关于鼠标事件的方法,并让它一直保持到 btn 单击或 mouseExited。或者可能是paintComponent 可能是解决方案。不知道如何实现其中任何一个,因此也无法尝试。甚至不确定我是否正确。
-
如需尽快获得更好的帮助,请发布SSCCE。查看
JLayeredPane(或类似名称)以覆盖按钮。