Eclipse WindowBuilder,重叠JPanels

我试图重叠JPanel实例。 将面板直接放在另一个面板上,位置和尺寸完全相同。 每次我这样做,它将另一面板移动到另一面或下面,前一面板是另一个更大的面板,并在其中有button。

我将如何做到这一点? 请记住,它使用的是窗口生成器工具。

你可能也想看OverlayLayout ,看这里 。 这不包括在传统的画廊 ,但它可能是有趣的。

覆盖样本

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

我试图重叠JPanels

使用JLayeredPane (链接教程下面的图片)。

的JLayeredPane

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

或者CardLayout如下所示。

这取决于你说的那两个是什么意思,因为我理解它们是完全不同的效果。

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

有关示例,请参阅如何使用内部框架

InternalFrameDemo


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

 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