Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将JPanel向下传递给子类_Java_Swing_Oop_Inheritance_Jpanel - Fatal编程技术网

Java将JPanel向下传递给子类

Java将JPanel向下传递给子类,java,swing,oop,inheritance,jpanel,Java,Swing,Oop,Inheritance,Jpanel,我正在用java练习OOP 我只想用一些图形对象编写一个游戏,但我想用一些类来构造它 总体布局应如下所示: MainClass->new MainPanel(扩展JPanel)->new StartWindow(扩展包含gameloop的抽象游戏窗口) 这样我就可以创建StartWindow、Level1Window、Level2Window等等。 我的StartWindow现在应该为第一层绘制布局。 StartWindow将创建其他对象(玩家、敌人等),这些对象稍后将负责绘制自己 所以我想创造

我正在用java练习OOP

我只想用一些图形对象编写一个游戏,但我想用一些类来构造它

总体布局应如下所示:

MainClass->new MainPanel(扩展JPanel)->new StartWindow(扩展包含gameloop的抽象游戏窗口)

这样我就可以创建StartWindow、Level1Window、Level2Window等等。 我的StartWindow现在应该为第一层绘制布局。 StartWindow将创建其他对象(玩家、敌人等),这些对象稍后将负责绘制自己

所以我想创造一些东西,比如“每个物体都有责任画自己”

我希望我能弄清楚这应该如何运作。 问题是,我不知道如何把这项任务下放

目前我的代码如下所示:

public class MainClass extends JFrame implements ActionListener {
    //..... other stuff
    public MainClass () {
        MainPanel mainPanel = new MainPanel();
    }
    //.... other stuff
}


class MainPanel extends JPanel {

    private GameWindow currentWindow;

    public MainPanel () {
        currentWindow = new StartWindow(this);
    }

    public void paintComponent(Graphics g) {
        g.drawRect (10, 10, 200, 200);  // <-- can see on the window
    }
}


abstract class GameWindow {
    // contains game loop and update functions and so on
}


public class StartWindow extends GameWindow {

    GamePanel _parentWindow;

    public StartWindow(GamePanel parentWindow) {
        super();
        _parentWindow = parentWindow;
    }

    public void paintComponent(Graphics g) {
        //Does not work
        g.drawRect (20, 20, 100, 100);  
    }
}
公共类MainClass扩展JFrame实现ActionListener{
//……其他东西
公共主类(){
MainPanel MainPanel=新的MainPanel();
}
//……其他东西
}
类主面板扩展了JPanel{
私人游戏窗口;
公共主面板(){
currentWindow=新的StartWindow(本);
}
公共组件(图形g){

g、 drawRect(10,10,200,200);//在MainPanel类的paintComponent方法中尝试类似的方法

public void paintComponent(Graphics g) {
  g.drawRect (10, 10, 200, 200);  // <-- can see on the window
  Graphics2D g2d = (Graphics2D) g.create();
  ((StartWindow) currentWindow).paintComponent(g2d);
  g2d.dispose();
}
公共组件(图形g){

g、 drawRect(10,10,200,200);//我会在你的主绘图组件中绘制精灵,例如

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

public class MainClass extends JFrame implements ActionListener {

    public static void main(String[] args) {
        System.out.println("Program Window1");
        MainClass glt = new MainClass();
        glt.setVisible(true);
    }

    // ..... other stuff
    public MainClass() {
        super("Fixed Timestep Game Loop Test");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(1, 2));

        System.out.println("Program Window2");
        MainPanel gamePanel = new MainPanel();

        cp.add(gamePanel, BorderLayout.CENTER);
        cp.add(p, BorderLayout.SOUTH);
        setSize(500, 500);
    }

    // .... other stuff

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
}

class MainPanel extends JPanel {

    private GameWindow currentWindow;

    public MainPanel() {
        currentWindow = new StartWindow(this);
    }

//    public void paintComponent(Graphics g) {
//        g.drawRect(0, 0, 200, 200); // <-- can see on the window
//    }

    // this should be protected, not public and should call super method 
    @Override  
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(0, 0, 200, 200); // <-- can see on the window
        currentWindow.draw(g);
    }
}

interface Drawable {
    void draw(Graphics g);
}

abstract class GameWindow implements Drawable {
    // contains game loop and update functions and so on
}

class StartWindow extends GameWindow {

    MainPanel _parentWindow;

    public StartWindow(MainPanel parentWindow) {
        super();
        _parentWindow = parentWindow;
    }

    @Override
    public void draw(Graphics g) {
        g.setColor(Color.red);
        g.drawRect(20, 20, 100, 100);
    }
}

然后,主模型持有一个集合,如
列表
,每次游戏循环滴答声时,它都会通过调用
滴答声(…)的列表进行迭代
关于列表中的每一项。

看看这个网站:只是一个一般性的建议——少关注扩展Swing组件,多关注游戏逻辑结构的继承。你可以(也应该)甚至创建不从JComponent继承的可绘制逻辑结构,但您提供了一种绘制方法,可能是通过您自己的
drawable
接口继承的。老实说,我认为我的继承结构很好。一个程序窗口,其中包含一个可绘制的面板窗口。此面板窗口包含级别窗口这是我可以创建和添加的,但我认为合适。每个LevelWindow都继承了我的gameloop窗口。那么,你最具体的问题是什么?你能创建一个程序吗?一个我们可以复制并粘贴到IDE中的程序,一个我们可以运行而不需要更改、不需要外部依赖项的程序,以及一个可以在一种具体的方式?明确的问题是:我如何在我的JPanel上绘制StartWindow类。这看起来像是危险的代码——当JVM真的应该这样做时,直接调用paintComponent,并且在这个过程中忽略组件边界和子组件的绘制。你能解释一下为什么推荐这样做吗?paintComponentStartWindow的方法与JComponent类的paintComponent方法无关。我认为他试图将StartWindow用作精灵。非常感谢,我试图理解您正在做的事情。您能解释一下gameloop引用的含义吗?您能修改您的代码,以便我能理解您试图引用的内容吗@Hunselunsel:也许是个更好的主意——请看编辑。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MainClass extends JFrame implements ActionListener {

    public static void main(String[] args) {
        System.out.println("Program Window1");
        MainClass glt = new MainClass();
        glt.setVisible(true);
    }

    // ..... other stuff
    public MainClass() {
        super("Fixed Timestep Game Loop Test");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(1, 2));

        System.out.println("Program Window2");
        MainPanel gamePanel = new MainPanel();

        cp.add(gamePanel, BorderLayout.CENTER);
        cp.add(p, BorderLayout.SOUTH);
        setSize(500, 500);
    }

    // .... other stuff

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
}

class MainPanel extends JPanel {

    private GameWindow currentWindow;

    public MainPanel() {
        currentWindow = new StartWindow(this);
    }

//    public void paintComponent(Graphics g) {
//        g.drawRect(0, 0, 200, 200); // <-- can see on the window
//    }

    // this should be protected, not public and should call super method 
    @Override  
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(0, 0, 200, 200); // <-- can see on the window
        currentWindow.draw(g);
    }
}

interface Drawable {
    void draw(Graphics g);
}

abstract class GameWindow implements Drawable {
    // contains game loop and update functions and so on
}

class StartWindow extends GameWindow {

    MainPanel _parentWindow;

    public StartWindow(MainPanel parentWindow) {
        super();
        _parentWindow = parentWindow;
    }

    @Override
    public void draw(Graphics g) {
        g.setColor(Color.red);
        g.drawRect(20, 20, 100, 100);
    }
}
public interface Tickable {
    void tick(int deltaTime);
}