簡體   English   中英

需要在秋千的不同屏幕之間切換

[英]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。 當您從一個傳遞到另一個時,只需將其中一個設置為可見,將最后一個設置為不可見。

但這實際上很奇怪,而不是我的建議。

不同的JPanel

與上面相同,但是沒有切換到可見/不可見; 您可以更改JFrame中的面板(當然,並重新繪制它)。

另外,這是一個不好的選擇,但我希望您了解執行此操作的不同方法(以防以后要執行其他操作,而其中一種成為更好的選擇)。

JOptionPane的

這是您游戲的好選擇。 您可以提示一個JOptionPane(帶有輸入文本或類似內容),詢問您棋盤的大小,然后獲取其響應,並將其傳遞給JFrame的構造函數,然后當游戲結束時,使用另一個JOptionPane(是/否)問>再玩一次? <

這里有幾個例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM