Индивидуальный класс для каждой карты в java Swing CardLayout - PullRequest
2 голосов
/ 04 декабря 2011

В целях архитектуры и дизайна я хотел бы создать свой графический интерфейс с классом для каждой карты в Java Swing CardLayout. а затем есть Mainapp, который создает графический интерфейс. У меня проблемы с этим сейчас.

Я бы хотел привести пример класса для главного меню со всеми расположениями кнопок и т. Д., А затем просто создать экземпляр этой карты и добавить ее в макет в другом классе. Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

очень простой пример, содержащий объекты Swing, сгенерированные из разных классов Java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OnTheFlyImageTest extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel cardPanel;
    private CardLayout cardLayout;

    public OnTheFlyImageTest() {
        JPanel cp = new JPanel(new BorderLayout());
        cp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        cardLayout = new CardLayout(5, 5);
        cardPanel = new JPanel(cardLayout);
        cp.add(cardPanel);
        for (int i = 0; i < 100; i++) {// Create random panels for testing.
            String name = "ImagePanel" + (i + 1);
            String image = (i & 1) == 0 ? "foo.gif" : "bar.gif";
            ImagePanel imgPanel = new ImagePanel(name, image);
            cardPanel.add(imgPanel, name);
            cardLayout.addLayoutComponent(imgPanel, name);
        }
        JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 5));
        JButton prevButton = new JButton("< Previous");
        prevButton.setActionCommand("Previous");
        prevButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cardLayout.previous(cardPanel);
            }
        });
        buttonPanel.add(prevButton);
        JButton nextButton = new JButton("Next >");
        nextButton.setActionCommand("Next");
        nextButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cardLayout.next(cardPanel);
            }
        });
        buttonPanel.add(nextButton);
        JPanel temp = new JPanel(new BorderLayout());
        temp.add(buttonPanel, BorderLayout.LINE_END);
        cp.add(temp, BorderLayout.SOUTH);
        setContentPane(cp);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Test");
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new OnTheFlyImageTest().setVisible(true);
            }
        });
    }
}

class ImagePanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private String imgString;
    private JLabel imgLabel;

    public ImagePanel(String name, String imgString) {
        setName(name);
        this.imgString = imgString;
        setLayout(new BorderLayout());
        // Ensure size is correct even before any image is loaded.
        setPreferredSize(new Dimension(640, 480));
    }

    @Override
    public void setVisible(boolean visible) {
        if (visible) {
            System.err.println(getName() + ": Loading and adding image");
            ImageIcon icon = new ImageIcon(imgString);
            imgLabel = new JLabel(icon);
            add(imgLabel);
        }
        super.setVisible(visible);
        if (!visible) { // Do after super.setVisible() so image doesn't "disappear".
            System.err.println(getName() + ": Removing image");
            if (imgLabel != null) { // Before display, this will be null
                remove(imgLabel);
                imgLabel = null; // Hint to GC that component/image can be collected.
            }
        }
    }
}
3 голосов
/ 04 декабря 2011

Возможно, вы хотите дать своему классу, использующему CardLayout, публичный метод loadCard, например,

public void loadCard(JComponent component, String key) {
  cardHolderPanel.add(component, key);
}

, где cardHolderPanel - это контейнер, в котором хранятся карточки.

Поскольку ваши классы создаются для работы в качестве карт, рассмотрите возможность их расширения от базового абстрактного класса или интерфейса, который имеет метод, который позволяет этому классу содержать собственный ключ String.Либо это, либо просто используйте свойство имени JComponent, чтобы компонент содержал свой собственный ключ String, который можно легко получить с помощью getName().

. Для более подробного ответа может потребоваться предоставить нам более подробную информацию.на вашем текущем приложении и его структуре.

...