Java 悬而未决的重叠问题

Java 悬而未决的重叠问题,java,swing,layout-manager,null-layout-manager,Java,Swing,Layout Manager,Null Layout Manager,我在Java Swing中遇到了这个问题: 品红色和绿色组件都是JButton。我用的是绝对布局。将鼠标悬停到绿色时,即使未应用布局管理器或未使用JLayeredPane,它也会与洋红色重叠 这种行为有什么原因吗?我如何确保在悬停到绿色时洋红保持在顶部 编辑2: 为了明确我的目标,我的想法是制作一个类似于Android通知栏的UI,带有辅助触摸功能。假设通知栏是一个层,辅助触摸是最顶层。在JLayeredPane中使用透明层的问题是,如果一个层/面板即使设置为透明,也占据了整个框架,那么它下面

我在Java Swing中遇到了这个问题:

品红色和绿色组件都是JButton。我用的是绝对布局。将鼠标悬停到绿色时,即使未应用布局管理器或未使用JLayeredPane,它也会与洋红色重叠

这种行为有什么原因吗?我如何确保在悬停到绿色时洋红保持在顶部

编辑2:
为了明确我的目标,我的想法是制作一个类似于Android通知栏的UI,带有辅助触摸功能。假设通知栏是一个层,辅助触摸是最顶层。在JLayeredPane中使用透明层的问题是,如果一个层/面板即使设置为透明,也占据了整个框架,那么它下面的层不会被绘制。

答案很简单:不要使用绝对布局,使用真正的
布局管理器。在这种情况下,
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();
            }
        });
    }
}

答案很简单:不要使用绝对布局,使用真正的
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();
            }
        });
    }
}

有一个方法
setComponentZOrder
,但我不确定它在这种情况下是否有用。正确地定位按钮以使其不重叠不是更好吗?为了明确我的目标,我的目标是创建3个相互重叠的JPanel,而不使用JLayeredPane。我注意到,当鼠标悬停在某个按钮上时,它会放弃初始的Z顺序。我会检查你建议的解决方案。无论如何,谢谢。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或者与布局填充和边框一起使用。有一种方法
setComponentZOrder
,但我不确定它在这种情况下是否有用。正确地定位按钮以使其不重叠不是更好吗?为了明确我的目标,我的目标是创建3个相互重叠的JPanel,而不使用JLayeredPane。我注意到,当鼠标悬停在某个按钮上时,它会放弃初始的Z顺序。我会检查你建议的解决方案。无论如何,谢谢。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。