How do I draw on a JPanel from multiple outside classes?

前端 未结 1 1545
南笙
南笙 2020-12-12 07:29

I am currently making a game with a main menu and a world where you actually play.

I have a class called Game, which inherits from JPanel and implement

相关标签:
1条回答
  • 2020-12-12 07:49

    Instead of having a single JPanel, why don't you try with a CardLayout and switch whether to show the InnerWorld or the OuterWorld according to a flag that determines where in the program you're at.

    As you're implementing KeyListener, I think that's for you to be able to move your character, please take a look at the accepted answer on this question: Keylistener not working for JPanel and use KeyBindings instead.

    Also avoid the use of setMimimum/Maximum/PreferredSize() and override those methods instead: Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

    Take this code as an example:

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class Game {
        private JFrame frame;
        private JButton button;
        private boolean status;
        private JPanel[] cards;
        private CardLayout cl;
        private JPanel gamePane;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> new Game().createAndShowGUI());
        }
    
        private void createAndShowGUI() {
            frame = new JFrame(getClass().getSimpleName());
            button = new JButton("Switch Worlds");
            status = true; //True = Inner / False = Outer
    
            cl = new CardLayout();
    
            gamePane = new JPanel(cl);
            cards = new JPanel[2];
    
            cards[0] = new InnerWorld();
            cards[1] = new OuterWorld();
    
            gamePane.add(cards[0], "innerWorld");
            gamePane.add(cards[1], "outerWorld");
    
            button.addActionListener(e -> {
                status = !status;
                if (status) {
                    cl.show(gamePane, "innerWorld");
                } else {
                    cl.show(gamePane, "outerWorld");
                }
            });
    
            frame.add(gamePane);
            frame.add(button, BorderLayout.SOUTH);
    
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    
    @SuppressWarnings("serial")
    class InnerWorld extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            Graphics2D g2d = (Graphics2D) g;
    
            g2d.drawString("Inner World", 50, 50);
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
    
    @SuppressWarnings("serial")
    class OuterWorld extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            Graphics2D g2d = (Graphics2D) g;
    
            g2d.drawString("Outer World", 50, 50);
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
    

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