Java 需要在swing中的不同屏幕之间切换
我正在尝试创建一个运行围棋游戏的程序。我想要一个屏幕,询问你有问题的围棋板的大小,一个真正玩游戏的屏幕,一个让你决定是否再玩一次的屏幕。使用Swing最有效的方法是什么?我看到人们在其他问题上谈论使用CardLayout,但我的理解是,用户可以根据需要在这些屏幕之间切换,这不是我想要的 如果Eclipse中的本机GUI构建器工作得更好,我也在使用Eclipse,但我从来没有想到如何使其工作。不同的选项: 不同的JFrame 您使用的每个“场景”对应一个JFrame。当您从一个传递到另一个时,您只需将其中一个设置为可见,最后一个设置为不可见 但这其实很奇怪,不是我的建议 不同的JPanel 同上,但不是切换到可见/不可见;您可以更改JFrame中的面板(当然,还可以重新绘制) 此外,这是一个错误的选择,但我想让你知道可以用不同的方法来做这件事(如果你以后想做一些不同的事情,其中一个会成为更好的选择) JOptionPaneJava 需要在swing中的不同屏幕之间切换,java,eclipse,swing,Java,Eclipse,Swing,我正在尝试创建一个运行围棋游戏的程序。我想要一个屏幕,询问你有问题的围棋板的大小,一个真正玩游戏的屏幕,一个让你决定是否再玩一次的屏幕。使用Swing最有效的方法是什么?我看到人们在其他问题上谈论使用CardLayout,但我的理解是,用户可以根据需要在这些屏幕之间切换,这不是我想要的 如果Eclipse中的本机GUI构建器工作得更好,我也在使用Eclipse,但我从来没有想到如何使其工作。不同的选项: 不同的JFrame 您使用的每个“场景”对应一个JFrame。当您从一个传递到另一个时,您只
这是一款适合你的游戏。你可以提示一个JOptionPane(带有输入文本或类似的内容),询问你棋盘的大小,然后得到它的响应并将其传递给JFrame的构造函数,当游戏结束时,使用另一个JOptionPane(是/否)询问>是否再次玩 稍微少一点模式的方法将允许用户选择和玩几种常见游戏之一。以这个基于按钮的内存为例
- 列举支持的游戏功能
- 将
值的实例添加到enum
JComboBox
- 使用
、remove()
和validate()
处理更改以更新游戏板repaint()
JLabel
用作游戏的占位符。或者,将游戏视图保留在适当的位置,更新可观察的游戏模型(如上所述),并安排倾听视图根据需要作出响应
“CardLayout是关于其他问题的,但我的理解是,用户可以根据需要在这些屏幕之间切换“-用户不能做任何您不允许他们做的事情。使用
CardLayout
,您可以控制何时切换视图这实际上就是我正在查看的示例,我没有注意到它声明了组合框,认为它是自动的。我想用这个方法,但我想看看是否有一个更简单的方法可以用。谢谢你。@Sig:我已经在上面提出了一个替代方案;它并不是特别简单,但随着游戏模型的发展,它的可伸缩性更高。为什么第二个选择不好呢?这似乎是一种相当直观的做事方式。对于你需要的东西来说,这是一个糟糕的选择。使用JOptionPane,您可以轻松检索所引入的值。
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);
}
}