JFrame / JPanel从其他类绘制

时间:2012-06-17 20:40:07

标签: java swing jframe jpanel paintcomponent

我正在用java开发一个简单的游戏。虽然这可能是一个愚蠢的问题,但我确实需要一些帮助。我的游戏将具有多个级别。我希望能够从新的类文件加载每个级别,使其更易于管理。如果这不是一个稳定的解决方案请告诉。

现在我的问题是这个。如果我的JPanel在类文件A中,我如何从类文件B中绘制它?想象一下类文件B是我的级别,所以我会有类文件C,D,E等等,所有不同的级别,我希望能够绘制到类文件A,它保存我的JPanel。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:2)

两种可能的解决方案是:

将类文件传递给JPanel,例如:

JPanel j = new JPanel();
Level l1 = new Level(1);
Level l2 = new Level(2);
j.initlevel(l1);
//wait until level 1 is done
j.initlevel(l2);

让initlevel进行加载:

public void initlevel(Level l){
    // for all level parts, load them into "this"
}

或者您可以将JPanel公开的某些属性设置为公开,并将其传递到级别:

JPanel j = new JPanel();
new Level(1, j);
//wait until level 1 is done
new Level(2, j);

制作Level的构造函数:

public Level(int level, JPanel j){
    //for all level parts load them into "j"
}

请注意,这是一个非常基本的结构,如果您的游戏变得有点复杂,您可能需要考虑阅读模型 - 视图 - 控制器模式。

答案 1 :(得分:2)

理想的设计使用户界面远离游戏逻辑,使您走在正确的轨道上。 一个这样的解决方案的示例可以是组成JPanel的类,该级别在级别改变时得到通知。 例如

public class LevelViewController implements LevelChangedListener {
   private JPanel viewPane;

   public LevelViewController(JPanel viewPane) {
      this.viewPane = viewPane;
   }

   public void levelChanged(Level level) {
      // Update JPanel with logic now the level has changed
      ...
   }
}

public interface LevelChangedListener {
     void levelChanged(Level level);
}

无论知道玩家要进入下一级别,都需要通知其LevelChangedListeners(您的LevelViewController是其中一个)的集合,这将反过来更新您的JPanel。如果您希望在级别发生变化时更新其他内容,您可以在其中挂钩其他LevelChangedListeners。