Search code examples
javaswingjlabelcentering

how to center JLabel in Jframe Swing?


I have this working code for a stop watch in Swing. I want to have the label Time Remaining 300 seconds centered on the second line`. here is my code. enter image description here

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class TimerGUI extends JPanel {
    JLabel promptLabel, timerLabel;
    final int count = 30;
    JButton start;
    JButton end;
    Timer timer;

    public TimerGUI() {
        setLayout(new GridLayout(0,2));

        start = new JButton("Start");
        add(start);
        Event e = new Event();
        start.addActionListener(e);

        end = new JButton("End");
        end.setEnabled(false);
        add(end);
        end.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                timer.stop();
                start.setEnabled(true);
                end.setEnabled(false);
                timerLabel.setText("Time Remaining " + count + " seconds");

            }

        });

        timerLabel = new JLabel("Time Remaining 300 seconds");
        add(timerLabel);

    }

    private class Event implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            start.setEnabled(false);
            end.setEnabled(true);
            timerLabel.setText("Time Remaining " + count + " seconds");

            TimeClass tc = new TimeClass(count);
            timer = new Timer(1000, tc);
            timer.start();

        }
    }

    private class TimeClass implements ActionListener {
        int counter;

        public TimeClass(int count) {
            this.counter = count;

        }

        @Override
        public void actionPerformed(ActionEvent e) {
            counter--;
            if (counter <= 5) {
                Toolkit.getDefaultToolkit().beep();
            }

            if (counter >= 1) {
                timerLabel.setText("Time Remaining " + counter + " seconds");
            } else {
                timer.stop();
                timerLabel.setText("game over");
            }

        }
    }

    public static void main(String[] args) {
        JFrame myframe = new JFrame();
        TimerGUI timer = new TimerGUI();
        // myframe.getContentPane().add(content,BorderLayout.CENTER);
        myframe.getContentPane().add(timer, BorderLayout.CENTER);
        myframe.setTitle("Hangman Game");
        myframe.pack();
        myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myframe.setLocationRelativeTo(null);
        myframe.setVisible(true);

    }

}

EDIT: changing to this.

timerLabel = new JLabel("Time Remaining 300 seconds");
        add(timerLabel,SwingConstants.CENTER);

gives different ouput, kindly see the image

enter image description here


Solution

  • Change your JLabel's horizontal alignment. The constructor can help you do this by changing:

    timerLabel = new JLabel("Time Remaining 300 seconds");
    

    to:

    timerLabel = new JLabel("Time Remaining 300 seconds", SwingConstants.CENTER);
    

    Also nest your JPanels each using its own layout. e.g.,

    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    
    import javax.swing.*;
    
    public class TimerFoo extends JPanel {
       public TimerFoo() {
          JPanel centerPanel = new JPanel(new GridLayout(0, 2));
          centerPanel.add(new JButton("Foo"));
          centerPanel.add(new JButton("Bar"));
    
          JLabel bottomLabel = new JLabel("Bottom Label", SwingConstants.CENTER);
    
          int gap = 5;
          setLayout(new BorderLayout(gap, gap));
          setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
          add(centerPanel, BorderLayout.CENTER);
          add(bottomLabel, BorderLayout.PAGE_END);
       }
    
       private static void createAndShowGui() {
          JFrame frame = new JFrame("TimerFoo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(new TimerFoo());
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }