需要在摆动的不同屏幕之间切换

时间:2016-04-19 07:35:26

标签: java eclipse swing

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

如果Eclipse中的本机GUI构建器工作得更好,我也在使用Eclipse,但我从未想过如何使它工作。

2 个答案:

答案 0 :(得分:2)

稍微不那么模态的方法将允许用户选择和玩几种常见游戏中的一种。使用此基于按钮的内存game作为示例,

  • 列举支持的游戏功能。

  • enum值的实例添加到JComboBox

  • 使用remove()validate()repaint()处理更改以更新游戏板。

在此示例中,JLabel用作游戏的占位符。或者,保留游戏视图,更新您的可观察游戏模型,如here所述,并安排听取视图以根据需要进行响应。

image

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。当你从一个传递到另一个时,你只需设置一个可见,最后一个不可见。

但这实际上是怪异的而不是我的推荐。

不同的JPanels

与上述相同,但不是切换到可见/不可见;你改变你在JFrame中的面板(当然,重新绘制它)。

此外,这是一个糟糕的选择,但我希望您知道不同的方法(如果您想稍后做一些不同的事情,其中​​一个会成为更好的选择)。

的JOptionPane

这对你的游戏来说很好。您可以提示一个JOptionPane(带有输入文本或类似的东西),询问您电路板的大小,然后获取其响应并将其传递给JFrame的构造函数,当游戏结束时,使用另一个JOptionPane(是/不)问>再玩一次? <

Here a few examples