Eclipse WindowBuilder, перекрывающиеся JPanels

Я пытаюсь перекрыть JPanel экземпляров. Положите панель прямо на другую, точно в том же положении и точного размера. Каждый раз, когда я это делаю, другая панель перемещается на другую сторону или вниз, предыдущая панель находится внутри другой, гораздо большей, и на ней есть кнопки.

Как бы я это сделал? Имейте в виду, что он использует инструмент Window Builder.


person Hydra    schedule 18.11.2012    source источник
comment
Помните, что он использует инструмент Window Builder. Прежде чем эффективно использовать любой Window Builder, важно понять базовые макеты и компоненты. См., в частности, Размещение компонентов внутри контейнера и Использование компонентов Swing.   -  person Andrew Thompson    schedule 18.11.2012


Ответы (3)


Вы также можете просмотреть 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;
    }
}
person trashgod    schedule 18.11.2012

Я пытаюсь перекрыть JPanels

Используйте JLayeredPane (изображение ниже из связанного руководства).

JLayeredPane

Поместите JPanel прямо на другой,

..или CardLayout, как показано здесь..

...в зависимости от того, какой из этих двух вы имеете в виду, поскольку я понимаю их как совершенно разные эффекты.

person Andrew Thompson    schedule 18.11.2012
comment
Спасибо, ребята, я сделал это ... однако у меня есть одна проблема, панель_2 успешно находится точно на панели_1, но подпанели, расположенные внутри панели_1, отображаются, когда я нажимаю кнопку, чтобы перейти на панель_2 ... в основном это меню, которое я нажал на Кнопку 1, и Panel_1 появляется с подпанелями внутри него, затем нажимаю кнопку 2, и появляется Panel_2, но каждый раз, когда я перехожу к Panel_2, как только программы, запускающие другие подпанели из Panel_1, появляются из нет где при наведении курсора на panel_2.... есть предложения? - person Hydra; 18.11.2012
comment
@AkeebKhan: Вы можете ответить на свой вопрос. - person trashgod; 18.11.2012
comment
есть предложения? Чтобы быстрее получить помощь, опубликуйте SSCCE. - person Andrew Thompson; 18.11.2012
comment
Сделал что? Единственный SSCCE, который я вижу, это тот, который опубликован @trashgod. Где находится ваш SSCCE? - person Andrew Thompson; 18.11.2012

Используйте JDesktopPane (или его суперкласс JLayeredPane) в качестве содержимого, добавляя к панели.

См. раздел Как использовать внутренние фреймы для примеров.

InternalFrameDemo


Здесь вы можете увидеть хороший способ наложения компонентов и всплывающих окон при наведении на них курсора:

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

Все еще есть некоторые проблемы при использовании компонентов, требующих фокуса, но они должны хорошо работать с JLabel и JPanel.

person Mordechai    schedule 18.11.2012