【问题标题】:JFrame/JPanel drawing from other class来自其他类的 JFrame/JPanel 绘图
【发布时间】:2012-06-19 22:29:50
【问题描述】:

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

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

【问题讨论】:

    标签: java swing jframe jpanel paintcomponent


    【解决方案1】:

    理想的设计使 UI 绘图远离游戏逻辑,因此您走在正确的轨道上。 此类解决方案的一个示例可能是一个组成 JPanel 的类,该 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。如果您想在关卡发生变化后更新其他内容,那么您也可以挂钩其他 LevelChangedListener。

    【讨论】:

      【解决方案2】:

      两种可能的解决方案是:

      把class文件传给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"
      }
      

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

      【讨论】:

      • 也可以考虑让关卡类扩展JPanel,这样你就可以覆盖他们的draw方法。
      • JPanel 没有draw 方法,您可能指的是paint() 方法。然后,您将当前的 JPanel 替换为 LevelPanel 或类似的东西
      • 是的,我的意思是paintComponent()
      猜你喜欢
      • 2012-10-17
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      相关资源
      最近更新 更多