我的两个类如何共享相同的JFrame或Frame?

时间:2014-05-15 00:46:53

标签: java swing inheritance

好吧,所以我的第一个类创建了Frame,并在其中放置了一个红色矩形,我可以移动它。现在我正在做的是,为蓝色矩形创建另一个类。 现在,在我的尝试中,我创建了第二个类,并将第一个类扩展到了它;这似乎没有做到这一点。

综述: 我需要做什么才能共享同一帧?有没有这方法?

已解决的版本 我的代码(头等舱): 已编辑

        import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;



public class MyGame extends JPanel implements ActionListener, KeyListener {
    Timer t = new Timer(5, this);
    int x = 0, y = 0, velx =0, vely =0, g = 0;
    private Color color;

    public MyGame() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(color);
        g.fillRect(x, y, 50, 30);
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if (x < 0) //stops us from going backwards past x = 0
        {
            velx = 0;
            x = 0;
        }

        if (y < 0) //stops us from going to the sky
        {
            vely = 0;
            y = 0;
        }

        if (y > 330) // stops us from going through the ground
        {
            vely = 0;
            y = 330;
        }

        x += velx;
        y += vely;
        repaint();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();

        {
            if (code == KeyEvent.VK_DOWN) {
                vely = 1; // removing velx = 0 allows us to go vertically and horizontlly at the same time

            }
            if (code == KeyEvent.VK_UP) {
                vely = -1; // same goes for here

            }
            if (code == KeyEvent.VK_LEFT) {

                velx = -1;
            }

            {
                if (code == KeyEvent.VK_RIGHT) {

                    velx = 1;

                }
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
        velx = 0;
        vely = 0;
    }




    public static void main (String arge[]){

        JFrame frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new Incoming());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }
}

(二等):已编辑

            import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;



public class Incoming extends MyGame {

private Color color;

int x = 0, y = 0, velx = 0, vely = 0;

public Incoming() {
    color = Color.BLUE;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(color);
    g.fillRect(x, y, 50, 30);
}

@Override
public void actionPerformed(ActionEvent e) {
    super.actionPerformed(e);
    if (x < 0) //stops us from going backwards past x = 0
    {
        velx = 0;
        x = 0;
    }

    if (y < 0) //stops us from going to the sky
    {
        vely = 0;
        y = 0;
    }

    if (y > 330) // stops us from going through the ground
    {
        vely = 0;
        y = 330;
    }

    x += velx;
    y += vely;
    repaint();
}

@Override
public void keyPressed(KeyEvent e) {
    super.keyPressed(e);
    int code = e.getKeyCode();

    {
        if (code == KeyEvent.VK_S) {
            vely = 1; // removing velx = 0 allows us to go vertically and horizontlly at the same time

        }
        if (code == KeyEvent.VK_NUMPAD8) {
            vely = -1; // same goes for here

        }
        if (code == KeyEvent.VK_NUMPAD4) {
            vely = 0;
            velx = -1;
        }

        {
            if (code == KeyEvent.VK_NUMPAD6) {
                vely = 0;
                velx = 1;

            }
        }
    }
}

@Override
public void keyReleased(KeyEvent e) {
    super.keyReleased(e);
    velx = 0;
    vely = 0;
}
}

谢谢

2 个答案:

答案 0 :(得分:1)

您可以利用组件的颜色属性支持或提供您自己的颜色属性,可以通过使用setter和getter来设置和检索

以下示例仅使用现有foreground属性组件...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class GameExample {

    public static void main(String[] args) {
        new GameExample();
    }

    public GameExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                MyGame game = new MyGame();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(game);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MyGame extends JPanel implements ActionListener {

        Timer t = new Timer(5, this);
        int x = 0, y = 0, velx = 0, vely = 0, g = 0;

        public MyGame() {
            t.start();
            setFocusTraversalKeysEnabled(false);
            setForeground(Color.RED);

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "up-pressed");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "down-pressed");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "left-pressed");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "right-pressed");

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "up-released");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "down-released");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "left-released");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "right-released");

            ActionMap am = getActionMap();
            am.put("up-pressed", new YDelatAction(-1));
            am.put("down-pressed", new YDelatAction(1));
            am.put("left-pressed", new XDelatAction(-1));
            am.put("right-pressed", new XDelatAction(1));

            am.put("up-released", new YDelatAction(0));
            am.put("down-released", new YDelatAction(0));
            am.put("left-released", new XDelatAction(0));
            am.put("right-released", new XDelatAction(0));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(getForeground());
            g.fillRect(x, y, 50, 30);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (x < 0) //stops us from going backwards past x = 0
            {
                velx = 0;
                x = 0;
            }

            if (y < 0) //stops us from going to the sky
            {
                vely = 0;
                y = 0;
            }

            if (y > 330) // stops us from going through the ground
            {
                vely = 0;
                y = 330;
            }

            x += velx;
            y += vely;
            repaint();
        }

        public class XDelatAction extends AbstractAction {

            private int value;

            public XDelatAction(int value) {
                this.value = value;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                vely = 0;
                velx = value;
            }

        }

        public class YDelatAction extends AbstractAction {

            private int value;

            public YDelatAction(int value) {
                this.value = value;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                vely = value;
            }

        }

    }

}

这将允许您通过执行...来创建使用不同颜色的新实例。

MyGame game = new MyGame();
game.setForeground(Color.BLUE);

或者您可以使用类似......

之类的东西创建一个新的子类
public class MyBlueGame extends MyGame {

    public MyBlueGame () {
        setForeground(Color.BLUE);
    }

}

一般来说,您应该支持key bindings API而不是KeyListener,因为它可以更好地控制生成关键事件所需的关注级别,并且通常会产生更多可重复使用和可配置的代码(恕我直言)< / p>

<强>更新

所以,基于你的示例代码...

每个类都需要它自己的color属性,它独立于另一个属性,否则继承会阻碍(并且父级将要使用子级的值)

您还需要更改子类的keyPressedkeyReleased方法,以便两个矩形可以相互独立地移动。

这不是我首选的解决方案。我会有一个能够呈现整个游戏状态(所有实体)的单个游戏界面,并且会提供一种方法,通过这种方式可以从表面添加(并且可能被移除)游戏元素和某种控制器能够控制这些元素的更新方式......但那只是我......

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class GameTest {

    public static void main(String[] args) {
        new GameTest();
    }

    public GameTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new Incoming());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MyGame extends JPanel implements ActionListener, KeyListener {

        Timer t = new Timer(5, this);
        int x = 0, y = 0, velx = 0, vely = 0, g = 0;

        private Color color;

        public MyGame() {
            color = Color.RED;
            t.start();
            addKeyListener(this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(color);
            g.fillRect(x, y, 50, 30);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (x < 0) //stops us from going backwards past x = 0
            {
                velx = 0;
                x = 0;
            }

            if (y < 0) //stops us from going to the sky
            {
                vely = 0;
                y = 0;
            }

            if (y > 330) // stops us from going through the ground
            {
                vely = 0;
                y = 330;
            }

            x += velx;
            y += vely;
            repaint();
        }

        @Override
        public void keyPressed(KeyEvent e) {
            int code = e.getKeyCode();

            {
                if (code == KeyEvent.VK_DOWN) {
                    vely = 1; // removing velx = 0 allows us to go vertically and horizontlly at the same time

                }
                if (code == KeyEvent.VK_UP) {
                    vely = -1; // same goes for here

                }
                if (code == KeyEvent.VK_LEFT) {

                    velx = -1;
                }

                {
                    if (code == KeyEvent.VK_RIGHT) {

                        velx = 1;

                    }
                }
            }
        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            velx = 0;
            vely = 0;
        }

    }

    public class Incoming extends MyGame {

        private Color color;

        int x = 0, y = 0, velx = 0, vely = 0;

        public Incoming() {
            color = Color.BLUE;
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(color);
            g.fillRect(x, y, 50, 30);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            super.actionPerformed(e);
            if (x < 0) //stops us from going backwards past x = 0
            {
                velx = 0;
                x = 0;
            }

            if (y < 0) //stops us from going to the sky
            {
                vely = 0;
                y = 0;
            }

            if (y > 330) // stops us from going through the ground
            {
                vely = 0;
                y = 330;
            }

            x += velx;
            y += vely;
            repaint();
        }

        @Override
        public void keyPressed(KeyEvent e) {
            super.keyPressed(e);
            int code = e.getKeyCode();

            {
                if (code == KeyEvent.VK_NUMPAD2) {
                    vely = 1; // removing velx = 0 allows us to go vertically and horizontlly at the same time

                }
                if (code == KeyEvent.VK_NUMPAD8) {
                    vely = -1; // same goes for here

                }
                if (code == KeyEvent.VK_NUMPAD4) {
                    vely = 0;
                    velx = -1;
                }

                {
                    if (code == KeyEvent.VK_NUMPAD6) {
                        vely = 0;
                        velx = 1;

                    }
                }
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            super.keyReleased(e);
            velx = 0;
            vely = 0;
        }
    }

}

答案 1 :(得分:0)

我认为您所要做的就是将颜色设置为类MyGame的参数,为您的班级添加字段颜色。

private Color colour;

public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Colour);
        g.fillRect(x,y,70,40);
}


            JFrame f = new JFrame();
            MyGame s = new MyGame();
             s.setCoulor(Color.RED)   //  s.setCoulor(Color.BLUE)
            f.add(s);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(600,400);
            f.setVisible(true);