Swing中的重叠问题

时间:2015-02-28 21:34:38

标签: java swing layout-manager null-layout-manager

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

Image of the problem

洋红色和绿色成分都是JButton。我正在使用绝对布局。当悬停到Green时,即使没有应用布局管理器也不使用JLayeredPane,它会与Magenta重叠。

出现这种行为的原因是什么?我怎样才能确保Magenta在悬停到绿色时保持在顶部?

编辑2: 为了明确我的目标,我们的想法是创建一个类似于Android Notification Bar with Assistive Touch的用户界面。假设通知栏是一个图层,而辅助触摸是最顶层。在JLayeredPane中使用透明层的问题是,如果图层/面板即使设置为透明也占据整个框架,则不会绘制其下面的图层。

1 个答案:

答案 0 :(得分:5)

答案很简单:不要使用绝对布局,使用真实LayoutManager。在这种情况下,BorderLayout似乎可以很好地完成工作。

Demo

见这个例子:

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();
            }
        });
    }
}