[英]Need to switch between different screens in swing
我正在嘗試創建一個運行Go游戲的程序。 我想要一個屏幕,詢問您所討論的Go棋盤的大小,一個實際玩游戲的屏幕,以及一個讓您決定是否再次玩的屏幕。 使用Swing最有效的方法是什么? 我看到人們談論在其他問題上使用CardLayout,但是我的理解是用戶可以按需在這些屏幕之間切換,這不是我想要的。
如果Eclipse中的本機GUI構建器可以更好地工作,我也正在使用Eclipse,但我從未想出如何使其工作。
稍微不那么模態的方法將允許用戶選擇並玩幾個普通游戲之一。 以這個基於按鈕的記憶游戲為例,
枚舉受支持的游戲功能。
將enum
值的實例添加到JComboBox
。
使用remove()
, validate()
和repaint()
處理更改以更新游戲板。
在此示例中, JLabel
充當游戲的占位符。 另外,離開你的游戲視圖到位,更新您觀察到的博弈模型,描述在這里 ,並安排聽音觀為要求作出回應。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* @see https://stackoverflow.com/a/36714997/230513
*/
public class Go {
private Game game = Game.Easy;
private final JComboBox gameCombo = new JComboBox();
enum Game {
Easy(9), Fast(13), Classic(17), Full(19);
private int size;
private String name;
private Game(int size) {
this.size = size;
this.name = this.name() + ": " + size + "\u00d7" + size;
}
public int size() {
return this.size;
}
@Override
public String toString() {
return this.name;
}
}
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel board = new JPanel() {
@Override
public Color getBackground() {
return Color.cyan.darker();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
};
board.add(new JLabel(game.toString()));
f.add(board);
JPanel p = new JPanel();
for (Game g : Game.values()) {
gameCombo.addItem(g);
}
gameCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
game = (Game) gameCombo.getSelectedItem();
board.removeAll();
board.add(new JLabel(game.toString()));
board.validate();
board.repaint();
}
});
p.add(new JButton("Start"));
p.add(gameCombo, BorderLayout.SOUTH);
f.add(p, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Go()::display);
}
}
不同的選擇:
每個使用的“場景”都有一個JFrame。 當您從一個傳遞到另一個時,只需將其中一個設置為可見,將最后一個設置為不可見。
但這實際上很奇怪,而不是我的建議。
與上面相同,但是沒有切換到可見/不可見; 您可以更改JFrame中的面板(當然,並重新繪制它)。
另外,這是一個不好的選擇,但我希望您了解執行此操作的不同方法(以防以后要執行其他操作,而其中一種成為更好的選擇)。
這是您游戲的好選擇。 您可以提示一個JOptionPane(帶有輸入文本或類似內容),詢問您棋盤的大小,然后獲取其響應,並將其傳遞給JFrame的構造函數,然后當游戲結束時,使用另一個JOptionPane(是/否)問>再玩一次? <
這里有幾個例子 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.