edm*_*die 1 java swing layout-manager null-layout-manager
我在Java Swing中遇到这个问题:

洋红色和绿色成分都是JButtons.我正在使用绝对布局.当悬停到绿色时,即使没有应用布局管理器也不使用JLayeredPane,它与Magenta重叠.
这种行为的原因是什么?如何在悬停到绿色时确保洋红色保持在顶部?
编辑2: 为了明确我的目标,我们的想法是创建一个类似于带有辅助触摸的Android通知栏的用户界面.假设通知栏是一个图层,而辅助触摸是最顶层.在JLayeredPane中使用透明层的问题是,如果图层/面板即使设置为透明也占据整个框架,则不会绘制其下面的图层.
答案很简单:不要使用绝对布局,使用真实LayoutManager.在这种情况下,似乎BorderLayout可以完成这项工作.

看这个例子:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class TestLayout {
protected void initUI() {
JFrame frame = new JFrame("test");
Container cp = frame.getContentPane();
cp.setLayout(new BorderLayout());
cp.add(createColoredButton(Color.BLACK, Color.MAGENTA, "Hello World 1"), BorderLayout.NORTH);
cp.add(createColoredButton(Color.BLACK, Color.GREEN, "Hello World 2"), BorderLayout.EAST);
cp.add(createColoredButton(Color.WHITE, Color.BLUE, "Hello World 3"), BorderLayout.CENTER);
// frame.pack();
frame.setSize(600, 600);
frame.setVisible(true);
}
private JButton createColoredButton(Color fgColor, Color bgColor, final String text) {
final JButton button = new JButton(text);
button.setBorderPainted(false);
button.setFocusPainted(false);
button.setForeground(fgColor);
button.setBackground(bgColor);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(button, "You just clicked: " + text);
}
});
return button;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestLayout().initUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)