1

I have a Jlabel called status that is empty. When I do status.setText() the first time it works normally but when I change it again it overlaps the first change instead of replacing it like it should. What is going on?

package panda.org;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.Math;

public class NumberGame implements ActionListener{

    JFrame frame;
    JLabel rules;
    JLabel rulesText;
    JLabel rulesText2;
    JLabel lets;
    JButton play;
    JButton exit;
    JPanel panel;

    Font myFont = new Font("Serif Plain", Font.BOLD, 15);

    NumberGame() {

        frame = new JFrame("NumberGame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setResizable(true);
        Image icon = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Gaming MSI\\Pictures\\Saved Pictures\\download (1).png");
        frame.setIconImage(icon);

        rules = new JLabel("Rules: ");
        rules.setFont(myFont);
        rules.setBounds(50, 100, 100, 75);

        rulesText = new JLabel("We will pick a random number in the range of 1 -> 50.");
        rulesText.setBounds(100, 100, 315, 75);

        rulesText2 = new JLabel("Your job is to guess that number!");
        rulesText2.setBounds(100, 120, 315, 75);

        play = new JButton("Play");
        play.setBounds(150, 300, 100, 75);
        play.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int failedAttempts = 0;

                JLabel label = new JLabel("Guess the number from 1 till 50");
                label.setFont(myFont);
                label.setBounds(150, 75, 315, 75);

                JLabel hints = new JLabel("");

                JTextField text = new JTextField();
                text.setBounds(250, 150, 100, 25);

                JButton check = new JButton("Check");
                check.setBounds(150, 150, 75, 25);

                double randomDouble = Math.random();
                randomDouble = randomDouble * 50 + 1;

                int randomInt = (int) randomDouble;

                double finalRandomDouble = randomDouble;
                check.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {

                        System.out.println(randomInt);
                        String nb = text.getText();

                        int change = Integer.parseInt(nb);

                        JLabel status = new JLabel("");
                        status.setBounds(150, 160, 1000, 100);

                        frame.add(status);

                        if(randomInt == change) {
                            status.setText("You chose the correct number!");
                            status.setForeground(Color.green);
                        }
                        if(randomInt != change) {
                            status.setText("Wrong choice! Try again.");
                            status.setForeground(Color.red);
                        }
                    }
                });

                rules.setText("");
                rulesText.setText("");
                rulesText2.setText("");

                frame.add(hints);
                frame.add(label);
                frame.add(check);
                frame.add(text);
            }
        });

        exit = new JButton("Exit");
        exit.setBounds(350, 300, 100, 75);
        exit.addActionListener(new ActionListener()  {
            public void actionPerformed(ActionEvent e) {

                int result = JOptionPane.showConfirmDialog(frame,"Are you sure want to exit?", "Exit",
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.QUESTION_MESSAGE);
                if(result == JOptionPane.YES_OPTION){
                    System.exit(0);
                }else if (result == JOptionPane.NO_OPTION){
                }else {
                }
            }
        });

        frame.add(play);
        frame.add(exit);
        frame.add(rules);
        frame.add(rulesText);
        frame.add(rulesText2);

        frame.setVisible(true);
    }

    public static void main(String[] args) {

        NumberGame number = new NumberGame();

    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

Someone asked for more code so this is all of my code! I hope this helps :D

The problem is in these lines


                        if(randomInt == change) {
                            status.setText("You chose the correct number!");
                            status.setForeground(Color.green);
                        }
                        if(randomInt != change) {
                            status.setText("Wrong choice! Try again.");
                            status.setForeground(Color.red);
                        }
                    }

This is how the result appears:
this is a pic of whats happening

Frakcool
  • 10,915
  • 9
  • 50
  • 89

2 Answers2

1

There are some improvements to do in your code:

  1. You're using null-layout and setBounds(...) which is not advised it will give you more headaches than solutions, it may seem like the best / easiest way to build complex GUIs but it's not, here's an example of why. Swing has to deal with multiple OS, PLAFs, screen sizes and resolutions, let the layout managers do that work for you, all you have to do is combine them.

  2. Every time you call check.addActionListener(new ActionListener() {, you're creating a new instance of your JLabel named status, and because you're using null-layout and you're placing it in the same position, they're overlapping.

Follow the first advice given in this answer, rebuild the whole thing with layout managers, move the status label as a class member and you shouldn't have any problems.

Frakcool
  • 10,915
  • 9
  • 50
  • 89
-1

try this:

if(randomInt == change) {
    status.setText("You chose the correct number!");
    status.setForeground(Color.green);
}else{
    status.setText("Wrong choice! Try again.");
    status.setForeground(Color.red);
}
I NN_
  • 139
  • 6
  • You also should post more of the code because you might be repeating the label creation in iterative code – I NN_ Apr 29 '21 at 17:59
  • It was originally an else but then it happened and changing it to two ifs didnt work so I came here – Ahmad Nasser Apr 29 '21 at 18:02