как настроить положение JPanel в Jpanel - PullRequest
0 голосов
/ 30 апреля 2018

Класс расширяет JPanel,

 public void createDisplay(){
    frame = new JFrame();
    frame.setTitle(title);
    frame.setSize(new Dimension(width, height));
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.setPreferredSize(new Dimension(width, height));
    this.setMaximumSize(new Dimension(width, height));
    this.setMinimumSize(new Dimension(width, height));

    this.setLayout(null); //have tried default and BorderLayout
    this.setSize(new Dimension(width, height));
    this.setBounds(0, 0, width, height);

    //basically trying everything

    frame.add(this);
    frame.pack();

}

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

Однако моя программа позже пытается добавить новый JPanel в расширение JPanel класса с помощью:

    public void gameOverWindow(){ ;
    JPanel panel = new JPanel(new BorderLayout());
    panel.setPreferredSize(new Dimension(200, 100));
    JLabel label = new JLabel("Game Over");
    label.setPreferredSize(new Dimension(40, 15));

   //trying setPosition also doesn't work with BorderLayout or FlowLayout

    JButton button_01 = new JButton("new");
    button_01.setPreferredSize(new Dimension(100, 10));
    JButton button_02 = new JButton("exit");
    button_02.setPreferredSize(new Dimension(100, 10));


    panel.add(label, BorderLayout.NORTH);
    panel.add(button_01, BorderLayout.WEST);
    panel.add(button_02, BorderLayout.EAST);



    this.add(panel);
    this.revalidate();


}

Этот новый JPanel появляется с содержимым в правильном формате BorderLayout, однако сам JPanel останется в верхнем центре расширенного JPanel, я знаю, что это потому, что для Layout по умолчанию установлено FlowLayout, однако установка BorderLayout будет просто заставьте панель занимать весь экран. Установка нулевого макета полностью разрушает рамку, и ничего не появляется, кроме кнопок «Свернуть» и «Закрыть» рамки. Попытка установить позицию или границы этого JPanel также не работает ни с каким макетом. Я читал много других сообщений в Интернете об этом, но все они, кажется, отличаются и становятся запутанными, как мне получить контроль над положением моей новой JPanel?

1 Ответ

0 голосов
/ 01 мая 2018

Обычно я бы рекомендовал использовать CardLayout для переключения между различными видами, но по имеющейся информации трудно определить, поможет ли это или нет

Вместо этого вы можете использовать составные макеты. То есть, обернуть один контейнер в другой, используя разные макеты.

В этом примере я просто использую комбинацию BorderLayout и GridBagLayout

Game Over ManGame Really Over Man

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            JButton gameOver = new JButton("Game over man");
            gameOver.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JPanel panel = new JPanel(new BorderLayout());
                    panel.add(new JLabel("Game Over Man", JLabel.CENTER), BorderLayout.NORTH);
                    panel.add(new JButton("New"), BorderLayout.WEST);
                    panel.add(new JButton("Exit"), BorderLayout.EAST);

                    removeAll();
                    JPanel inner = new JPanel(new GridBagLayout());
                    inner.add(panel);
                    add(inner);
                    revalidate();
                    repaint();
                }
            });
            JPanel inner = new JPanel(new GridBagLayout());
            inner.add(gameOver);
            add(inner);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

Какова цель удаления компонентов другой панели вместо простого добавления ее в GridBagLayout?

Потому что они мешают расположению других компонентов.

тогда я хочу, чтобы маленькая Jpanel появлялась внутри и была ненавязчивой

Вы можете использовать glassPane фрейма или использовать OverlayLayout

Например:

Большая часть этой информации должна была быть в вашем первоначальном вопросе, она бы потратила меньше времени друг друга

...