簡體   English   中英

Java Swing 無法獲取變量的值

[英]Java Swing Can't Get Value Of Variable

我試圖用兩個不同的幀制作游戲。 (我知道它無效)無論如何我的問題是我無法獲得我在 actionListener function 下更改的變量的值。

public void Pick_Char() {
    
    frame2 = new JFrame();
    frame2.setBounds(100, 100, 925, 805);
    frame2.setLocationRelativeTo(null);
    frame2.setResizable(false);
    frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    
    JPanel panel = new JPanel();
    
    btnNewButton = new JButton("Gözlüklü Şirin");
    btnNewButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
                        
            Main window = null;
            try {
                 
                window = new Main();
            } catch (IOException e1) {
                
                e1.printStackTrace();
            }

            flag1=true;
            window.frame2.setVisible(false);
            frame2.dispose();
            window.frame.setVisible(true);
            
            
            
        }
    });

public Main() throws IOException {
    Pick_Char();
        initialize();
        if(flag1 == true)
             GamePlay();
      
       
}

我談論的變量是flag1。 我在全局范圍內聲明了該變量。 我想要做的是當我按下按鈕時,它會關閉該框架並打開其他框架(它已經在工作)並給我 flag1 值。 我沒有得到任何錯誤,但我無法獲得 flag1 的值。 GamePlay function 不工作。 請幫我

介紹

我整理了一個示例 Swing GUI 來展示如何在每個玩家都有自己的JPanel的情況下創建多人游戲。 在顯示播放器JPanels之間會出現一個計時器JPanel ,因此您有時間切換座位。

這是玩家 1 的JPanel

玩家 1 JPanel

這是計時器JPanel ,正在倒計時。

定時器 JPanel

這是 Player 2 的JPanel

播放器 2 JPanel

我不僅更改了JLabel文本。 您在一個JFrame中看到兩個玩家JPanels

解釋

當我創建 Swing GUI 時,我使用model / view / controller (MVC) 模式。 這種模式使我能夠分離我的關注點,並一次專注於 Swing 應用程序的一部分。

使用 Java Swing 的 MVC 模式是這樣工作的:

  1. 該視圖從 model 讀取信息。
  2. 該視圖不會更新 model。
  3. controller 更新 model 並重新繪制/重新驗證視圖。

通常,一個 Swing 應用程序有多個 controller 類,每個操作一個。 這個例子有一個ActionListener因為我們所做的只是切換播放器JPanels

Model

此應用程序有兩個 model 類, PlayerGameState 目前, Player class 擁有玩家姓名。 有關玩家的所有其他游戲信息,例如得分,都在此 class 中。

GameState class 保存有關游戲 state 的信息。 Player實例List告訴我們玩家的數量,而int playerTurn告訴我們輪到誰了。

看法

這個 Swing GUI 由一個JFrame組成,主JPanel使用CardLayout 每個玩家都有自己的JPanel 播放器JPanel底部的JButton將您切換到下一個播放器。

每個玩家JPanel都包含來自GameState class 的玩家玩游戲需要看到的任何信息。 播放器JPanel上可能還有其他JButtons可以改變播放器的 state。 當玩家完成他的回合時,他點擊下一個回合JButton將游戲傳遞給下一個玩家。

Controller

現在,唯一的ActionListener是切換播放器JPanels的那個。 有一個由 Swing Timer控制的內部ActionListener ,允許玩家切換座位。 您可以在外部ActionListener class 中調整倒計時時間。 其他JButtons會觸發其他ActionListeners

代碼

這是完整的可運行示例。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class MultiPlayerGame implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new MultiPlayerGame());
    }
    
    private CardLayout cardLayout;
    
    private GameState gameState;
    
    private JLabel timerLabel;
    
    private JPanel mainPanel;
    private JPanel timerPanel;
    
    private PlayerPanel[] playerPanels;
    
    public MultiPlayerGame() {
        this.gameState = new GameState();
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("MultiPlayer Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        this.mainPanel = createMainPanel();
        frame.add(mainPanel, BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        cardLayout =  new CardLayout();
        JPanel panel = new JPanel(cardLayout);
        
        List<Player> players = gameState.getPlayers();
        playerPanels = new PlayerPanel[players.size()];
        for (int i = 0; i < players.size(); i++) {
            Player player = players.get(i);
            playerPanels[i] = new PlayerPanel(this, gameState, 
                    player);
            panel.add(playerPanels[i].getPanel(), player.getName());
        }
        
        timerPanel = createTimerPanel();
        panel.add(timerPanel, "timer");
        
        return panel;
    }
    
    private JPanel createTimerPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        
        timerLabel = new JLabel(" ");
        timerLabel.setFont(panel.getFont().deriveFont(16f));
        panel.add(timerLabel);
        
        return panel;
    }
    
    public void updateTimerPanel(Player player, int seconds) {
        String text = "" + seconds + " seconds before " + 
                player.getName() + " may play";
        timerLabel.setText(text);
    }
    
    public CardLayout getCardLayout() {
        return cardLayout;
    }

    public JPanel getMainPanel() {
        return mainPanel;
    }

    public JPanel getTimerPanel() {
        return timerPanel;
    }

    public class PlayerPanel {
        
        private final MultiPlayerGame frame;
        
        private final GameState model;
        
        private final JPanel panel;

        public PlayerPanel(MultiPlayerGame frame, GameState model, Player player) {
            this.frame = frame;
            this.model = model;
            this.panel = createPlayerPanel(player);
        }
        
        private JPanel createPlayerPanel(Player player) {
            JPanel panel = new JPanel(new BorderLayout(5, 5));
            panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            panel.setPreferredSize(new Dimension(300, 200));
            
            JLabel label = new JLabel(player.getName());
            label.setFont(panel.getFont().deriveFont(Font.BOLD, 24f));
            label.setHorizontalAlignment(JLabel.CENTER);
            panel.add(label, BorderLayout.BEFORE_FIRST_LINE);
            
            JButton button = new JButton("Next Player's Turn");
            button.addActionListener(new ButtonListener(frame, model));
            panel.add(button, BorderLayout.AFTER_LAST_LINE);
            
            return panel;
        }

        public JPanel getPanel() {
            return panel;
        }
        
    }
    
    public class ButtonListener implements ActionListener {
        
        private final MultiPlayerGame frame;
        
        private final GameState model;
        
        private Timer timer;

        public ButtonListener(MultiPlayerGame frame, GameState model) {
            this.frame = frame;
            this.model = model;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            int delayPeriod = 30;
            int turn = model.nextPlayerTurn();
            Player player = model.getPlayers().get(turn);
            CardLayout cardLayout = frame.getCardLayout();
            timer = new Timer(1000, new ActionListener() {
                private int delay = delayPeriod;
                
                @Override
                public void actionPerformed(ActionEvent innerEvent) {
                    --delay;
                    frame.updateTimerPanel(player, delay);
                    if (delay < 0) {
                        cardLayout.show(frame.getMainPanel(), 
                                player.getName());
                        timer.stop();
                    }
                }
            });
            timer.start();
            frame.updateTimerPanel(player, delayPeriod);
            cardLayout.show(frame.getMainPanel(), "timer");
        }
        
    }
    
    public class GameState {
        
        private int playerTurn;
        
        private final List<Player> players;
        
        public GameState() {
            this.players = new ArrayList<>();
            this.players.add(new Player("Player 1"));
            this.players.add(new Player("Player 2"));
            this.playerTurn = 0;
        }
        
        public int nextPlayerTurn() {
            playerTurn = ++playerTurn % players.size();
            return playerTurn;
        }

        public int getPlayerTurn() {
            return playerTurn;
        }

        public List<Player> getPlayers() {
            return players;
        }
        
    }
    
    public class Player {
        
        private final String name;

        public Player(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
        
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM