为填字游戏创建 GUI 的最佳方法是什么?.java



我对Java比较陌生。我在编程的逻辑方面有经验,但在GUI方面没有那么多经验。我创建了一个填字游戏生成器,它获取一个包含单词和定义的文本文件并制作填字游戏。目前,我将解决方案存储在字符的 2d 数组中。我需要弄清楚如何显示填字游戏并根据解决方案检查用户输入。我想知道使用秋千或某种图形组件显示它的"最简单"方法是什么。我正在考虑使用TilePane和文本框,但我对GUI非常陌生,我不知道如何编码。在您提出的解决方案中,请提供一些示例代码来说明如何制作它。

非常感谢您的投入。

当涉及到GUI时,总是有很多选择。在这里要求最佳解决方案几乎是不可行的。一方面,因为可能没有"最佳"解决方案。另一方面,为了找出解决方案的"好"程度(或者它是否是"最佳"解决方案),必须在需求规范和评估指标方面非常精确。

但是,在最简单的形式之一中,要求拥有一个可以显示 char[][] 数组(并允许将当前显示的内容作为 char[][] 数组获取)的 GUI 组件可以像这样实现......

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class CrosswordGUI
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new BorderLayout());
        JPanel container = new JPanel(new FlowLayout());
        final CrosswordPanel panel = new CrosswordPanel();
        container.add(panel);
        f.getContentPane().add(container, BorderLayout.CENTER);
        JButton generateButton = new JButton("Generate");
        generateButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                generate(panel);
            }
        });
        f.getContentPane().add(generateButton, BorderLayout.SOUTH);
        f.setSize(800, 800);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
    private static Random random = new Random(0);
    private static void generate(CrosswordPanel panel)
    {
        int w = 4 + random.nextInt(8);
        int h = 4 + random.nextInt(8);
        char crossword[][] = new char[w][h];
        for (int y=0; y<h; y++)
        {
            for (int x=0; x<w; x++)
            {
                if (random.nextFloat() > 0.2)
                {
                    char c = (char)('A' + random.nextInt(26));
                    crossword[x][y] = c;
                }
            }
        }
        panel.setCrossword(crossword);
    }
}

class CrosswordPanel extends JPanel
{
    private JTextField textFields[][];
    void setCrossword(char array[][])
    {
        removeAll();
        int w = array.length;
        int h = array[0].length;
        setLayout(new GridLayout(w, h));
        textFields = new JTextField[w][h];
        for (int y=0; y<h; y++)
        {
            for (int x=0; x<w; x++)
            {
                char c = array[x][y];
                if (c != 0)
                {
                    textFields[x][y] = new JTextField(String.valueOf(c));
                    textFields[x][y].setFont(textFields[x][y].getFont().deriveFont(20.0f));
                    add(textFields[x][y]);
                }
                else
                {
                    add(new JLabel());
                }
            }
        }
        getParent().validate();
        repaint();
    }
    char[][] getCrossword()
    {
        int w = textFields.length;
        int h = textFields[0].length;
        char crossword[][] = new char[w][h];
        for (int y=0; y<h; y++)
        {
            for (int x=0; x<w; x++)
            {
                if (textFields[x][y] != null)
                {
                    String s = textFields[x][y].getText();
                    if (s.length() > 0)
                    {
                        crossword[x][y] = s.charAt(0);
                    }
                }
            }
        }
        return crossword;
    }
}

最新更新