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