Java-GUI、面板和数据访问

Java-GUI、面板和数据访问,java,class,subclass,jframe,jpanel,Java,Class,Subclass,Jframe,Jpanel,我正在制作一个有三个主面板和几个子面板的游戏,我对如何“连接”面板和它们的数据感到困惑 我有一个主类,它扩展了JFrame并添加了三个JPanel。每个面板都是JPanel的一个子类。(例如:JPanel gameControlPanel=new gameControlPanel(),其中gameControlPanel是我为扩展JPanel而创建的一个类。) 现在,所有游戏数据(如游戏状态和两个保存已保存玩家和已保存分数的ArrayList)都在游戏面板中。但我需要从另外两个面板获取并设置数据

我正在制作一个有三个主面板和几个子面板的游戏,我对如何“连接”面板和它们的数据感到困惑

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

现在,所有游戏数据(如游戏状态和两个保存已保存玩家和已保存分数的ArrayList)都在游戏面板中。但我需要从另外两个面板获取并设置数据。而如何做到这一点就是逃避我

**所以我的问题是:我该怎么做?如何从另一个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.
private ArrayList savedPlayers;//为暂停并退出游戏的玩家保存保存的数据。
私有ArrayList savedScores;//从玩过游戏并死亡的玩家那里获得高分。
私有ArrayList birdList=新ArrayList();//由于其随机性和对玩家不重要而未序列化。
私有ArrayList cloudList=新ArrayList();//由于其随机性和对玩家不重要而未序列化。
私人玩家游戏玩家;//保存游戏实例所有数据的玩家对象。

我想从另外两个面板(gameDataPanel的类和gameControlButton的类)内部访问该数据。

数据应存储在UI部件之间共享的模型中,仅将UI面板用于演示。使用观察者模式通知UI演示文稿模型中的更改。

研究该模式。将游戏状态和数据存储到模型中,并使用观察者或侦听器将数据中的更改通知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);
        }
在构造函数内部,只需将面板注册为
播放器的侦听器

这样,无论什么时候某个东西救了一个玩家,不管它是哪个组件/类,所有相关方都会收到更改通知。并确保将
播放器的同一实例传递给所有面板


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

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

例如:

public class Global
 {
     private static Object objectName;

     public Object getObjectName()
     {
         return objectName;
     }

     public void setObjectName(Object objectName)
     {
         this.objectName = objectName;
     }
}

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

我不明白。看,我有所有的数据,并希望在其他面板中显示。我只是不知道如何获得它,以便我可以展示它。你能给我一个如何制作我的程序的例子吗:哪个类将扩展JFrame和JPanels,它们将如何连接?请阅读本文:
public class Global
 {
     private static Object objectName;

     public Object getObjectName()
     {
         return objectName;
     }

     public void setObjectName(Object objectName)
     {
         this.objectName = objectName;
     }
}