【问题标题】:Eclipse WindowBuilder, overlapping JPanelsEclipse WindowBuilder,重叠 JPanel
【发布时间】:2012-11-06 08:53:42
【问题描述】:

我正在尝试重叠 JPanel 实例。将面板直接放在另一个面板上,位置和尺寸完全相同。每次我这样做时,它都会将另一个面板移动到另一侧或下方,前一个面板位于另一个更大的面板内,并且其中有按钮。

我该怎么做?请记住,它使用的是 Window Builder 工具。

【问题讨论】:

标签: java swing overlay layout-manager windowbuilder


【解决方案1】:

使用JDesktopPane(或其超类JLayeredPane)作为其内容,添加到窗格中。

请参阅How to Use Internal Frames 以获取examples


在这里你可以看到一个很好的让组件叠加的方法,当光标停留在它上面时弹出:

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class ShiftedStackPanel extends JPanel implements MouseListener,
                                                            ActionListener {

    private static final long serialVersionUID = 1988454751139668485L;

    private int layer;
    private JDesktopPane desktopPane;
    private Timer timer;
    private Component currentComponent;
    private int layerOfCurrent;
    private int shiftDivision;

    public ShiftedStackPanel() {
        this(4);
    }

    public ShiftedStackPanel(int shift) {
        shiftDivision = shift;

        setLayout(new BorderLayout(0, 0));

        desktopPane = new JDesktopPane();
        desktopPane.setBackground(SystemColor.window);
        super.add(desktopPane);
        timer = new Timer(1000, this);
        timer.setRepeats(false);

    }

    public Component add(Component c) {
        Dimension dim = c.getPreferredSize();
        c.setBounds(
                (desktopPane.getComponentCount() * (dim.width / shiftDivision)),
                0, dim.width, dim.height);
        desktopPane.add(c, new Integer(++layer));
        c.addMouseListener(this);
        return c;
    }

    public void remove(Component c) {
        throw new IllegalArgumentException(
                "Removal of component, not yet supported.");
        // FIXME: allow removal, and shift all latter comps, to left
    }

    public void removeAll() {
        desktopPane.removeAll();
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("JFrame Wrapper");
        ShiftedStackPanel p;
        f.setContentPane(p = new ShiftedStackPanel(4));
        p.add(new JTextField("ABCDEFGHI"));
        p.add(new JTextField("DEFGHIJKL"));
        p.add(new JTextField("GHIJKLMNO"));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setMinimumSize(new Dimension(400, 200));
        f.setLocationRelativeTo(null);
    }

    @Override
    public void mouseClicked(MouseEvent evt) {
        if (currentComponent != null) {
            Component c = (Component) evt.getSource();
            currentComponent = c;
            layerOfCurrent = desktopPane.getLayer(c);
            desktopPane.remove(c);
            desktopPane.add(c, new Integer(100));
        }
    }

    @Override
    public void mouseEntered(MouseEvent evt) {
        timer.start();
        Component c = (Component) evt.getSource();
        currentComponent = c;
        layerOfCurrent = desktopPane.getLayer(c);
    }

    @Override
    public void mouseExited(MouseEvent evt) {
        if ((currentComponent != null) && currentComponent == evt.getSource()) {
            desktopPane.remove(currentComponent);
            desktopPane.add(currentComponent, new Integer(layerOfCurrent));
            currentComponent = null;
            timer.stop();
        }
    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void actionPerformed(ActionEvent arg0) {

        desktopPane.remove(currentComponent);
        desktopPane.add(currentComponent, new Integer(100));
    }
}

在使用需要焦点的组件时仍然存在一些问题,但应该可以很好地与JLabelJPanel 配合使用。

【讨论】:

    【解决方案2】:

    我正在尝试重叠 JPanel

    使用JLayeredPane(下图来自链接教程)。

    直接把一个JPanel放在另一个上,

    ..或CardLayout 如图所示here..

    ..取决于您指的是哪两个,因为我将它们理解为完全不同的效果。

    【讨论】:

    • 谢谢大家,我做到了...但是我有一个问题,panel_2 正好在 panel_1 上,但是,当我单击按钮时,位于 panel_1 内的子面板会显示出来进入panel_2 ...基本上它是一个菜单,我单击按钮1,Panel_1在其中出现子面板,然后单击按钮2,Panel_2出现但是,每次我越过panel_2时,一旦程序运行另一个子-将鼠标悬停在 panel_2 上时,panel_1 中的面板突然弹出......有什么建议吗?
    • @AkeebKhan:你可以answer your own question
    • “有什么建议吗?” 如需尽快获得更好的帮助,请发帖SSCCE
    • 做了什么?我看到的唯一 SSCCE 是 posted by @trashgod你的 SSCCE在哪里?
    【解决方案3】:

    您可能还想查看OverlayLayout,查看here。它不包含在传统的gallery 中,但它可能会引起人们的兴趣。

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.OverlayLayout;
    
    /** @see http://stackoverflow.com/a/13437388/230513 */
    public class OverlaySample {
    
        public static void main(String args[]) {
            JFrame frame = new JFrame("Overlay Sample");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel();
            panel.setLayout(new OverlayLayout(panel));
            panel.add(create(1, "One", Color.gray.brighter()));
            panel.add(create(2, "Two", Color.gray));
            panel.add(create(3, "Three", Color.gray.darker()));
            frame.add(panel, BorderLayout.CENTER);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        private static JLabel create(final int index, String name, Color color) {
            JLabel label = new JLabel(name) {
                private static final int N = 64;
    
                @Override
                public boolean isOpaque() {
                    return true;
                }
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(index * N, index * N);
                }
    
                @Override
                public Dimension getMaximumSize() {
                    return new Dimension(index * N, index * N);
                }
            };
            label.setHorizontalAlignment(JLabel.RIGHT);
            label.setVerticalAlignment(JLabel.BOTTOM);
            label.setBackground(color);
            label.setAlignmentX(0.0f);
            label.setAlignmentY(0.0f);
            return label;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多