A individual class for each Card in java swing CardLayout

前端 未结 2 1927
失恋的感觉
失恋的感觉 2020-12-20 03:05

For architecture and design purposes I would like to design my GUI with a class for each card in a Java Swing CardLayout. and then have a mainapp that builds the GUI. I am

相关标签:
2条回答
  • 2020-12-20 03:10

    very simple example that held Swing Objects generated from different Java Classes

    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.
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-20 03:30

    Perhaps you want to give your class that uses the CardLayout a public loadCard method, something like

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

    where cardHolderPanel is the container that holds the cards.

    Since your creating classes to act as cards, consider having them all extend from a base abstract class or an interface that has a method that allows this class to hold its own key String. Either that or simply use the JComponent name property to have a component hold its own key String, one that can easily be obtained via getName().

    For a more detailed answer, you may need to give us more details on your current application and its structure.

    0 讨论(0)
提交回复
热议问题