CardLayout () в графическом интерфейсе Java

В моем коде в настоящее время каждая карточка имеет размер моей рамки. Как установить разные размеры каждой из моих панелей в макете. Я попытался сделать фрейм разных размеров, вызвав метод run () и изменив размер фрейма, но это не сработало. Я надеюсь, что есть другой способ. Это мой код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GameManager
{
    JFrame frame;
    JPanel cards,Title;
    public GameManager()
    {
        cards = new JPanel(new CardLayout());
        Title title = new Title();
        cards.add(title,"title");
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "title");
    }
    public static void main(String [] args)
    {
        GameManager gm = new GameManager();
        gm.run();
    }
    public void run()
    {
        frame = new JFrame("Greek Olympics");
        frame.setSize(1000,1000);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(cards);
        frame.setVisible(true);
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "title");
    }
    public class Title extends JPanel
    {
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.fillRect(100,100,100,100);
        }
    }
}

Как мне изменить код, чтобы добавить еще одну панель с другим размером?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
66
1

Ответы 1

How do I set different sizes of each of my panels in the layout

Во-первых, поймите, что CardLayout будет использовать свойство preferredSize всех представлений, которыми он управляет, для определения наилучшего результирующего размера, который должен использовать контейнер, которым он управляет. Это означает, что если вы вызываете pack в кадре (вместо setSize), он будет иметь размер (автоматически) для самого большого компонента, которым управлял (CardLayout).

How would I change the code so that if I wanted to add another panel with a different size?

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

public class Title extends JPanel
{
    @Override 
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.fillRect(100,100,100,100);
    }
}

Затем вместо setSize используйте pack.

public void run()
{
    frame = new JFrame("Greek Olympics");
    //frame.setSize(1000,1000);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(cards);
    frame.pack();
    CardLayout cl = (CardLayout)(cards.getLayout());
    cl.show(cards, "title");
    frame.setVisible(true);
}

Пример...

Это базовый пример, который устанавливает две панели: одну с preferredSize или 200x200, а другую - с 400x400.

Когда вы запустите его, вы обнаружите, что окно будет не меньше 400x400, и обе панели будут одинакового размера.

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
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);

                CardLayout cardLayout = new CardLayout();
                JPanel base = new JPanel(cardLayout);
                base.add(makePanel(200, 200, Color.RED), "red");
                base.add(makePanel(400, 400, Color.BLUE), "blue");

                frame.add(base);

                JButton blue = new JButton("Blue");
                blue.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        cardLayout.show(base, "blue");
                    }
                });
                JButton red = new JButton("red");
                red.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        cardLayout.show(base, "red");
                    }
                });

                JPanel buttons = new JPanel();
                buttons.add(red);
                buttons.add(blue);

                frame.add(buttons, BorderLayout.SOUTH);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public TestPane makePanel(int width, int height, Color background) {
        TestPane pane = new TestPane(new Dimension(width, height));
        pane.setBackground(background);
        return pane;
    }

    public class TestPane extends JPanel {

        private JLabel label;
        private Dimension preferredSize;

        public TestPane(Dimension size) {
            label = new JLabel("...");
            setLayout(new GridBagLayout());
            add(label);
            this.preferredSize = size;
        }

        @Override
        public Dimension getPreferredSize() {
            return preferredSize;
        }

        @Override
        public void invalidate() {
            super.invalidate();
            label.setText(getWidth() + "x" + getHeight());
        }

    }

}

Вроде ничего не меняет. К счастью, он компилируется, но размер кадра не меняется.

Anushka 06.05.2018 02:22

Основываясь на примере, размер кадра должен быть таким, чтобы он оборачивал компонент, который должен иметь размер 200x200 - дополнительные компоненты будут влиять на конечный размер кадра, обеспечивая максимальную ширину / высоту (в зависимости от их предпочтительных размеров) для всех управляемые компоненты - рамка не меняет размер для каждого вида, и я бы этого не делал, так как это раздражает

MadProgrammer 06.05.2018 02:45

Я сделал ваш код, и фактический фрейм не виден. Я добавил, но рамка не отображается. Я неправильно реализовал?

Anushka 06.05.2018 03:08

import java.awt. *; import java.awt.event. *; import javax.swing. *; import javax.swing.event. *; открытый класс GameManager {JFrame frame; Карты JPanel, Экран заголовка, Экран событий, Запуск; общедоступный GameManager () {карты = новый JPanel (новый CardLayout ()); Заголовок экрана заголовка = новый экран заголовка (); cards.add (заголовок, «заголовок»); EventsScreen events = новый EventsScreen (); card.add (события, «события»); Бег бежать = новый Бег (); card.add (запустить, «бегать»); } public static void main (String [] args) {GameManager gm = new GameManager (); gm.run (); }

Anushka 06.05.2018 03:09

public void run () {frame = new JFrame («Греческие Олимпийские игры»); //frame.setSize(1000,750); frame.pack (); frame.setLocation (0,0); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); //frame.getContentPane().add(cards); frame.add (карты); frame.setVisible (правда); CardLayout cl = (CardLayout) (cards.getLayout ()); cl.show (карты, «титул»); }

Anushka 06.05.2018 03:09

открытый класс TitleScreen расширяет JPanel реализует MouseListener, MouseMotionListener {логическое playButtonClicked, howButtonClicked, play; int mouseX, mouseY; общедоступный TitleScreen () {playButtonClicked = howButtonClicked = play = false; mouseX = mouseY = 0; addMouseListener (это); addMouseMotionListener (это); } общественное измерение getPreferredSize () {вернуть новое измерение (400 400); }

Anushka 06.05.2018 03:09

Это весь мой код, что я делаю не так, что фрейм больше не виден?

Anushka 06.05.2018 03:10

@Anushka Комментарии не лучшее место для размещения кода - я обновил ответ работоспособным примером

MadProgrammer 06.05.2018 07:18

Другие вопросы по теме