Joel Bickel
Joel Bickel

Reputation: 1

How to add JLabels to JFrame?

I'm pretty sure I have to make a container and add the labels to the container in the win() and lose() methods. But how should I do this? Also, if you have any other tips to make the code more readable and coherent.

P.S. This is my first time using Java Swing to program graphics, so I know the code is very messy. I mostly just care if the program works the way I want it to...

P.P.S There were a few class variables, but StackOverflow wouldn't let me post them

public class TwoDBettingGame extends JFrame {

    /** Constructor to setup the UI components */
    public TwoDBettingGame() {
        Container cp = this.getContentPane();
        cp.setLayout(new FlowLayout(FlowLayout.CENTER));
        if (money == 0) {
            money = 1000;
        }

        // Define the UI components
        JLabel label1 = new JLabel("Your money: $"+String.valueOf(money));
        JLabel label2 = new JLabel("How much would you like to bet?");
        JLabel label3 = new JLabel("$");
        JTextArea textarea1 = new JTextArea(1, 3);
        Icon heads = new ImageIcon(getClass().getResource("heads.png"));
        Icon tails = new ImageIcon(getClass().getResource("tails.png"));
        JButton buttonheads = new JButton(" Heads", heads);
        JButton buttontails = new JButton(" Tails", tails);

        // Define preferred characteristics
        label1.setFont(new Font("Times New Roman", 1, 50));
        label2.setFont(new Font("Times New Roman", 1, 33));
        label3.setFont(new Font("Times New Roman", 1, 70));
        textarea1.setEditable(true);
        textarea1.setFont(new Font("Times New Roman", 1, 60));
        buttonheads.setPreferredSize(new Dimension(200, 75));
        buttontails.setPreferredSize(new Dimension(200, 75));
        buttonheads.setFont(new Font("Times New Roman", 1, 30));
        buttontails.setFont(new Font("Times New Roman", 1, 30));

        // Create new panel with buttons 1 and 2
        JPanel panel2 = new JPanel();
        panel2.add(buttonheads);
        ((FlowLayout)panel2.getLayout()).setHgap(40);
        panel2.add(buttontails);

        // Add all UI components
        cp.add(label1);
        cp.add(label2);
        cp.add(label3);
        cp.add(textarea1);
        cp.add(panel2);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // Exit when close button clicked
        setTitle("Betting Game"); // "this" JFrame sets title
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);  // or pack() the components
        setResizable(false); // window can't be resized
        setLocationRelativeTo(null); // puts window in center of screen
        setVisible(true);  // show it

        // Add action listeners to buttons
        buttonheads.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sideBetOn = "heads";
                // Get TextArea text
                String betString = textarea1.getText();
                try{
                    bet = Integer.parseInt(betString);
                } catch (NumberFormatException n) {
                    bet = 0;
                }
                buttonClicked();
            }
        });
        buttontails.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sideBetOn = "tails";
                // Get TextArea text
                String betString = textarea1.getText();
                try{
                    bet = Integer.parseInt(betString);
                } catch (NumberFormatException n) {
                    bet = 0;
                }
                buttonClicked();
            }
        });
    }

    public void buttonClicked() {
        if (bet > 0 && bet <= money) {
            int x = rand.nextInt(2); 
            if (x == 0) {
                coinOutcome = "heads";
            } else {
                coinOutcome = "tails";
            } if (coinOutcome.equals(sideBetOn)) {
                money = money + bet;
                dispose();
                win();
                Wait();
            } else {
                money = money - bet;
                dispose();
                lose();
                Wait();
                if (money <= 0) {
                    System.exit(0);
                } else {
                    dispose();
                    main(null);
                }
            }
        }
    }
    public void Wait() {
        try {
            Thread.sleep((long) (secs*1000));  //1000 milliseconds is one second.
        } catch(InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }
    public void win() {
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout(FlowLayout.CENTER));

        // Define the UI components
        JLabel label4 = new JLabel("The coin flip was " + coinOutcome + ".");
        JLabel label5 = new JLabel("You won $" + bet + "!");

        // Define preferred characteristics
        label4.setFont(new Font("Times New Roman", 1, 20));
        label5.setFont(new Font("Times New Roman", 1, 20));

        // Add all UI components
        frame.add(label4);
        frame.add(label5);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // Exit when close button clicked
        setTitle("You Win!!!"); // "this" JFrame sets title
        setSize(WINDOW_WIDTH2, WINDOW_HEIGHT2);  // or pack() the components
        setResizable(false); // window can't be resized
        setLocationRelativeTo(null); // puts window in center of screen
        setVisible(true);  // show it
    }
    public void lose() {
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout(FlowLayout.CENTER));

        // Define the UI components
        JLabel label4 = new JLabel("The coin flip was " + coinOutcome + ".");
        JLabel label5 = new JLabel("You lost $" + bet + "!");

        // Define preferred characteristics
        label4.setFont(new Font("Times New Roman", 1, 20));
        label5.setFont(new Font("Times New Roman", 1, 20));

        // Add all UI components
        frame.add(label4);
        frame.add(label5);

        if (money <= 0) {
            JLabel label6 = new JLabel("I'm sorry, you lost. Better luck next time...");
            label6.setFont(new Font("Times New Roman", 1, 12));
            frame.add(label6);
        }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // Exit when close button clicked
        setTitle("You Lose :("); // "this" JFrame sets title
        setSize(WINDOW_WIDTH2, WINDOW_HEIGHT2);  // or pack() the components
        setResizable(false); // window can't be resized
        setLocationRelativeTo(null); // puts window in center of screen
        setVisible(true);  // show it
    }

    /** The entry main() method */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TwoDBettingGame();  // Let the constructor do the job
            }});
    }
}

Upvotes: 0

Views: 480

Answers (1)

Andrew Thompson
Andrew Thompson

Reputation: 168825

How to add JLabels to JFrame?

I'm pretty sure I have to make a container and add the labels to the container in the win() and lose() methods..

I wouldn't use that approach. A label without text or icon is invisible (unless it has a visible border). So create and add the label at start-up with no text. When a win or loss is achieved, set some text.

If the layout refuses to add space for the label without any text (e.g. in the PAGE_START of a BorderLayout it would have no height), add some text to it before pack() is called, and set it to no text afterwards.

Upvotes: 3

Related Questions