Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要在swing中的不同屏幕之间切换_Java_Eclipse_Swing - Fatal编程技术网

Java 需要在swing中的不同屏幕之间切换

Java 需要在swing中的不同屏幕之间切换,java,eclipse,swing,Java,Eclipse,Swing,我正在尝试创建一个运行围棋游戏的程序。我想要一个屏幕,询问你有问题的围棋板的大小,一个真正玩游戏的屏幕,一个让你决定是否再玩一次的屏幕。使用Swing最有效的方法是什么?我看到人们在其他问题上谈论使用CardLayout,但我的理解是,用户可以根据需要在这些屏幕之间切换,这不是我想要的 如果Eclipse中的本机GUI构建器工作得更好,我也在使用Eclipse,但我从来没有想到如何使其工作。不同的选项: 不同的JFrame 您使用的每个“场景”对应一个JFrame。当您从一个传递到另一个时,您只

我正在尝试创建一个运行围棋游戏的程序。我想要一个屏幕,询问你有问题的围棋板的大小,一个真正玩游戏的屏幕,一个让你决定是否再玩一次的屏幕。使用Swing最有效的方法是什么?我看到人们在其他问题上谈论使用CardLayout,但我的理解是,用户可以根据需要在这些屏幕之间切换,这不是我想要的

如果Eclipse中的本机GUI构建器工作得更好,我也在使用Eclipse,但我从来没有想到如何使其工作。

不同的选项:

不同的JFrame 您使用的每个“场景”对应一个JFrame。当您从一个传递到另一个时,您只需将其中一个设置为可见,最后一个设置为不可见

但这其实很奇怪,不是我的建议

不同的JPanel 同上,但不是切换到可见/不可见;您可以更改JFrame中的面板(当然,还可以重新绘制)

此外,这是一个错误的选择,但我想让你知道可以用不同的方法来做这件事(如果你以后想做一些不同的事情,其中一个会成为更好的选择)

JOptionPane
这是一款适合你的游戏。你可以提示一个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);
    }
}