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

时间:2014-02-13 13:06:11

标签: java user-interface crossword

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

非常感谢您的投入。

1 个答案:

答案 0 :(得分:1)

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

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

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;
    }

}