【问题标题】:Java - GUI, Panel, and Data AccessingJava - GUI、面板和数据访问
【发布时间】:2011-04-20 15:50:52
【问题描述】:

我正在制作一个包含三个主面板和几个子面板的游戏,我对如何“连接”这些面板及其数据感到困惑。

我有我的主类,它扩展了 JFrame 并添加了三个 JPanel。这些面板中的每一个都是 JPanel 的子类。 (例如:JPanel gameControlPanel = new GameControlPanel(),其中 GameControlPanel 是我为扩展 JPanel 而创建的一个类。)

现在,所有游戏数据(例如游戏状态,以及保存已保存玩家和已保存分数的两个数组列表)都在游戏面板中。但我需要从其他两个面板获取和设置该数据。而如何做到这一点是在逃避我。

** 所以我的问题是:我该怎么做?如何从另一个 JPanel 子类(具有相同的父 JFrame)访问一个 JPanel 子类中的数据?


如果有帮助,这是扩展的 JFrame 类的代码,我在其中添加了三个面板...:

    JPanel controlButtonsPanel = new GameControlButtons();
    controlButtonsPanel.setPreferredSize(new Dimension(801,60));
    controlButtonsPanel.setBorder(new LineBorder(Color.white, 1));
    constraints.anchor = GridBagConstraints.NORTHWEST;
    constraints.weightx = 2;
    constraints.weighty = 0.3;
    this.add(controlButtonsPanel, constraints);

    JPanel gameDataPanel = new GameDataPanel();
    gameDataPanel.setPreferredSize(new Dimension(500,838));
    gameDataPanel.setBorder(new LineBorder(Color.white, 2));
    constraints.anchor = GridBagConstraints.NORTHEAST;
    constraints.weightx = 1;
    constraints.weighty = 2;
    this.add(gameDataPanel, constraints);

    JPanel graphicsPanel = new RoofRunnerGame("Ken");
    constraints.anchor = GridBagConstraints.SOUTHWEST;
    constraints.weightx = 2;
    constraints.weighty = 1;
    graphicsPanel.setBorder(new LineBorder(Color.white, 1));
    graphicsPanel.setPreferredSize(new Dimension(800,800));
    graphicsPanel.requestFocus();
    this.add(graphicsPanel, constraints);       

graphicsPanel 包含所有这些数据:

private ArrayList<Player> savedPlayers;                                     // Holds saved data for player's who paused and exited game.
private ArrayList<Player> savedScores;                                      // Holds high scores from player's who played game and died.
private ArrayList<Birds> birdList = new ArrayList<Birds>();                 // Not serialized due to its randomness and unimportance to player.
private ArrayList<Clouds> cloudList = new ArrayList<Clouds>();              // Not serialized due to its randomness and unimportance to player.
private Player gamePlayer;                                                  // Player object that holds all data for a game instance.

我想从其他两个面板(gameDataPanel 的类和 gameControlButton 的类)中访问该数据。

【问题讨论】:

    标签: java class subclass jframe jpanel


    【解决方案1】:

    您说要在多个面板中显示某些信息? 您可以创建一个全局类来静态保存这些数据,然后使用get...();set...(); 方法从其他类访问这些信息。

    例子:

    public class Global
     {
         private static Object objectName;
    
         public Object getObjectName()
         {
             return objectName;
         }
    
         public void setObjectName(Object objectName)
         {
             this.objectName = objectName;
         }
    }
    

    如果我需要进一步说明,请告诉我。

    【讨论】:

      【解决方案2】:

      研究Model View Controller 模式。将游戏状态和数据存储到模型中,并使用 Observers 或 listeners 通知 UI 组件数据的变化。

      例如,如果您遵循 Swing 的实现方式,请定义一个监听器接口,如下所示:

      public interface PlayersListener {
          void playerSaved(Player player);
      }
      

      然后,您可以使用类似以下的 Players 类来代替 savedPlayers 列表:

      public class Players {
          private List<PlayersListener> listeners = ...;
          private List<Player> players = ...;
      
          public void addPlayersListener(PlayersListener listener) {
              if (!listeners.contains(listener)) {
                  listeners.add(listener);
              }
          }
      
          public voi removePlayerListener(PlayerListener listener) {
              listeners.remove(listener);
          }
      
          public voi savePlayer(Player player) {
              players.add(player);
              for (PlayerListener listener : listeners) {
                  listener.playerSaved(player);
              }
      

      当你创建一个需要观察保存的玩家的新面板时,你可以在构造函数中将 Players 类的实例传递给面板:

      controlButtonsPanel = new GameControlButtons(players);
      ..
      gameDataPanel = new GameDataPanel(players);
      

      在构造函数中,只需将面板注册为players 的侦听器。

      这样,每当 something 保存播放器时,无论它是哪个组件/类,所有相关方都会收到有关更改的通知。并确保将Players 的同一实例传递给所有面板。

      这实际上也是 Swing 组件的工作方式,如果你看一下 JPanel,它有许多不同的 addSomethingListener 方法。侦听器是实现特定侦听器接口的类。并且模型在许多组件中是可交换的,例如 JTable 使用 TableModel,而 TableModel 又被定义为接口。但是,在您的情况下,您可能不需要能够使用不同的模型实现。

      【讨论】:

        【解决方案3】:

        数据应存储在 UI 部件之间共享的模型中,仅使用 UI 面板进行演示。使用观察者模式通知 UI 演示模型的变化。

        【讨论】:

        • 我不明白。看,我有所有数据,并想在其他面板中显示它。我只是不知道如何得到它,所以我可以展示它。
        • 您能否举个例子说明您将如何制作我的程序:哪个类将扩展 JFrame 和 JPanels,它们将如何连接?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多