我有一个带有 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() 但没有任何效果。???