[英]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
。
這是計時器JPanel
,正在倒計時。
這是 Player 2 的JPanel
。
我不僅更改了JLabel
文本。 您在一個JFrame
中看到兩個玩家JPanels
。
當我創建 Swing GUI 時,我使用model / view / controller (MVC) 模式。 這種模式使我能夠分離我的關注點,並一次專注於 Swing 應用程序的一部分。
使用 Java Swing 的 MVC 模式是這樣工作的:
通常,一個 Swing 應用程序有多個 controller 類,每個操作一個。 這個例子有一個ActionListener
因為我們所做的只是切換播放器JPanels
。
此應用程序有兩個 model 類, Player
和GameState
。 目前, 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
將游戲傳遞給下一個玩家。
現在,唯一的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.