在 Java 中无需摇摆即可获取文本输入

Getting text input without swing in Java

嗨,我正在 Java 中制作一个随机生成 100 个数字的游戏,然后 要求用户尽可能多地记住,然后尽可能多地回忆。我的游戏使用 JPanel 和 Graphics g 对象来完成所有绘图。我如何 "draw" 一个 JTextfield 或让它在 jpanel 上工作?

将 ActionListener 添加到 JTextField,然后将该 JTextField 添加到 JPanel。现在使用 this.add(jpnel, BorderLayout.SOUTH); 将此 JPanel 添加到 JFrame 创建一个新的 JPanel class 板,您可以在其中绘制内容。将该 JPanel 作为 this.add(new Board(), BorderLayout.CENTER); 添加到 JFrame。 在这里,我为您编写了一个示例。现在你应该知道怎么做了...

棋盘class

    public class Board extends JPanel {

    int[] numbers = {3, 25, 5, 6, 60, 100};
    int index = 0;
    static String num;
    boolean once = true;
    FontMetrics fm;

    Board() {
        setPreferredSize(new Dimension(400, 200));
        setBackground(Color.decode("#ffde00"));
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D) g;
        if (index < 6) {
            num = numbers[index] + "";
        } else {
            num = "Game Ended.";
            Window.ans.setEditable(false);
        }
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setFont(new Font("Arial", Font.PLAIN, 50));
        if(once){
            fm = g2.getFontMetrics();
            once = false;
        }
        int x = ((getWidth() - fm.stringWidth(num)) / 2);
        int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
        g2.drawString(num + "", x, y);
        index++;
    }

}

Window class

    public class Window extends JFrame {

    JPanel p = new JPanel();
    JLabel lbl = new JLabel("Enter the number if you have seen it before, Else empty.");
    JLabel res = new JLabel("....");
    static JTextField ans = new JTextField(10);
    Board board = new Board();

    public Window() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(board, BorderLayout.CENTER);
        p.setLayout(new BorderLayout(8, 8));
        p.add(lbl, BorderLayout.WEST);
        ans.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (ans.getText().equals(Board.num)) {
                    res.setText("Good");
                } else {
                    res.setText("Bad");
                }
                ans.setText("");
                board.repaint();
            }

        });
        p.add(ans, BorderLayout.CENTER);
        p.add(res, BorderLayout.EAST);
        p.setBorder(new EmptyBorder(10, 10, 10, 10));
        this.add(p, BorderLayout.SOUTH);
        setResizable(false);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Window();
            }
        });
    }

}