1

Hi I'm making a game in Java that randomly generates 100 numbers, and then ask the user to memorize as many as then can and then try to recall as many as they can. My game uses a JPanel and a Graphics g object to do all the drawing. How do I "draw" a JTextfield or get one to work on a jpanel?

1

1 Answer 1

3

Add a ActionListener to JTextField and then add that JTextField to JPanel. Now add this JPanel to JFrame using this.add(jpnel, BorderLayout.SOUTH); Create a new JPanel class Board where you draw things. Add that JPanel to JFrame as, this.add(new Board(), BorderLayout.CENTER);. Here I coded one example for you. Now you should have an idea how to do that...

Board 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();
            }
        });
    }

}
Sign up to request clarification or add additional context in comments.

5 Comments

Why would you add a KeyListener to a JTextField ? That is what a DocumentListener is for. Besides, if you only listen for ENTER, you might as well add an ActionListener to the JTextField, which is triggered each time ENTER is pressed.
He could simply use jtf.getText();
@CodeRunner with in the textfield? Oh in that case I understand.
I generate all the random numbers into an array and then draw them to the screen with g.drawString(); The g.drawString methods are in the random number class, and then I have a seperate class that is supposed to get the input. So you're saying I just go to the GamePanel class (contains main game loop and JPanel stuff) and add the jtexfield there which can use a static boolean from the input class to determine whether to draw or not?
It doesn't work. Adding the JTextField to the JPanel does not work because it's immediately covered by images drawn by the Graphics g object.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.