CardLayout () в графическом интерфейсе Java - PullRequest
0 голосов
/ 05 мая 2018

В моем коде в настоящее время каждая карта имеет размер моего кадра. Как мне установить разные размеры каждой из моих панелей в макете. Я попытался сделать фрейм разных размеров, вызвав метод 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);
        }
    }
}

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

1 Ответ

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

Как настроить разные размеры каждой из моих панелей в макете

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

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

Каждый компонент, который вы добавляете в 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());
        }

    }

}
...