繁体   English   中英

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

[英]How could my two classes share the same JFrame or Frame?

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

Summery: 我需要怎么做才能使它们共享同一帧? 有办法吗?

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

        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;
}
}

谢谢

您可以利用组件的颜色属性支持,也可以提供自己的颜色属性,可以通过使用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);
    }

}

一般而言,您应该比KeyListener更喜欢键绑定API ,因为它可以更好地控制生成键事件所需的焦点级别,并且通常会产生更多可重用和可配置的代码(IMHO)

更新

因此,根据您的示例代码...

每个类都需要自己的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;
        }
    }

}

我认为您要做的就是将颜色设置为类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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM