我正在尝试创建一个运行Go游戏的程序。我想要一个屏幕,询问你有问题的Go板的大小,一个真正玩游戏的屏幕,以及一个让你决定再玩一次的屏幕。使用Swing最有效的方法是什么?我看到人们谈论在其他问题上使用CardLayout但我的理解是用户可以按需切换这些屏幕,这不是我想要的。
如果Eclipse中的本机GUI构建器工作得更好,我也在使用Eclipse,但我从未想过如何使它工作。
答案 0 :(得分:2)
稍微不那么模态的方法将允许用户选择和玩几种常见游戏中的一种。使用此基于按钮的内存game作为示例,
列举支持的游戏功能。
将enum
值的实例添加到JComboBox
。
使用remove()
,validate()
和repaint()
处理更改以更新游戏板。
在此示例中,JLabel
用作游戏的占位符。或者,保留游戏视图,更新您的可观察游戏模型,如here所述,并安排听取视图以根据需要进行响应。
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);
}
}
答案 1 :(得分:1)
不同的选择:
您使用的每个“场景”的一个JFrame。当你从一个传递到另一个时,你只需设置一个可见,最后一个不可见。
但这实际上是怪异的而不是我的推荐。
与上述相同,但不是切换到可见/不可见;你改变你在JFrame中的面板(当然,重新绘制它)。
此外,这是一个糟糕的选择,但我希望您知道不同的方法(如果您想稍后做一些不同的事情,其中一个会成为更好的选择)。
这对你的游戏来说很好。您可以提示一个JOptionPane(带有输入文本或类似的东西),询问您电路板的大小,然后获取其响应并将其传递给JFrame的构造函数,当游戏结束时,使用另一个JOptionPane(是/不)问>再玩一次? < 强>