如何在JFrame Swing中居中JLabel?

16

我有一个在Swing中工作的秒表代码。我想让标签剩余时间300秒居中于第二行。这是我的代码。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);

    }

}

编辑: 更改为这个。

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

输出不同,请查看图片

在此输入图片描述

4个回答

26

更改JLabel的水平对齐方式。 构造函数可以通过更改以下内容来帮助您完成此操作:

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

还可以使用不同布局嵌套多个JPanels,例如:

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

我最开始使用的是BorderLayout,但那似乎完全破坏了整个布局。 - brain storm
我的意思是,这会搞乱一切。我只有一个JPanel。那么你在这里指的嵌套是什么意思? - brain storm
@user1988876:是否存在一个来自高层的规则,必须绝对使用一个且仅使用一个JPanel?这似乎是个愚蠢的规则,是为了打破而制定的。请参见上面的例子。 - Hovercraft Full Of Eels
不是所有的都需要。没有理由只选择JPanel。但我想知道是否绝对必要。因为最终的timerGUI将成为mainGUI的另一个组件。我会研究你的例子。 - brain storm
@user1988876:是的,我做了。这个类本身扩展了JPanel并使用了BorderLayout。我将一个JPanel centerPanel添加到它的BorderLayout.CENTER位置,并将JLabel添加到它的BorderLayout.PAGE_END位置。 - Hovercraft Full Of Eels
显示剩余4条评论

12

你可以使用这个来使它水平居中

labelVariable.setHorizontalAlignment(JLabel.CENTER);

1
这是一个很好的答案,因为它也适用于JLabel是私有的情况。加一分 :) - user7627726

5
您可以使用以下内容。
jLabelvariable.setLocation((this.getWidth()-jLabelvariable.getWidth())/2,50);

这里的50表示标签距离框架顶部的高度。

1

阅读JLabel的JavaDoc。它包含类和所有API的描述,包括文本对齐。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接