Java 修改JLabel文本会更改其对齐方式

Java 修改JLabel文本会更改其对齐方式,java,swing,alignment,jlabel,Java,Swing,Alignment,Jlabel,我试图有一个对话框显示一个带有标签的进度条。我已将标签设置为与JLabel.center对齐,并使用方框 最初,标签显示为居中,这就是我正在寻找的。但是,当更改标签的文本时(通过使用代码“creatingQueriesLabel.setText(文本)”,标签现在显示为左对齐 任何帮助都将不胜感激!这是我的代码 JFrame frame = new JFrame("Creating queries ..."); frame.setDefaultCloseOperation(JFr

我试图有一个对话框显示一个带有标签的进度条。我已将标签设置为与JLabel.center对齐,并使用方框

最初,标签显示为居中,这就是我正在寻找的。但是,当更改标签的文本时(通过使用代码“creatingQueriesLabel.setText(文本)”,标签现在显示为左对齐

任何帮助都将不胜感激!这是我的代码

    JFrame frame = new JFrame("Creating queries ...");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Box box = Box.createVerticalBox();

    JPanel panel = new JPanel();
    panel.setLayout(null);

    creatingQueriesLabel = new JLabel("Initializing ... ");
    creatingQueriesLabel.setSize(480, 160);
    creatingQueriesLabel.setLocation(10, 10);
    creatingQueriesLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT);

    box.setLocation(0, 10);
    box.setSize(480, 160);
    box.add(creatingQueriesLabel);

    progressBar = new JProgressBar();
    progressBar.setSize(480, 50);
    progressBar.setValue(0);
    progressBar.setStringPainted(true);
    progressBar.setLocation(creatingQueriesLabel.getX(),
            creatingQueriesLabel.getY() + creatingQueriesLabel.getHeight());

    panel.add(progressBar);

    frame.add(box);
    frame.add(panel);

    // Display the window.
    frame.pack();
    frame.setSize(520, 280);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

/**
 * Invoked when task's progress property changes.
 */
public void propertyChange(PropertyChangeEvent evt)
{
    if ("progress" == evt.getPropertyName())
    {
        int progress = (Integer) evt.getNewValue();
        progressBar.setValue(progress);
    }
    if ("currentQueryText" == evt.getPropertyName())
    {
        String text = (String) evt.getNewValue();
        creatingQueriesLabel.setText(text);
    }
}
问题:

  • 您正在使用绝对定位设置大小和位置——不要这样做,因为Swing不是这样工作的,这将导致GUI很难维护和增强,正如您所发现的那样
  • 构造JLabel时,请使用
    SwingConstants.CENTER
    int使其文本居中
  • 将其添加到使用BorderLayout的容器中,可能位于
    BorderLayout.PAGE\u START
    位置
  • 不相关的问题--不要这样做:
    if(“currentQueryText”==evt.getPropertyName()){
    。此测试的是引用相等性,而不是您想要测试的。请改用equals方法
  • 这个GUI看起来应该是一个对话框窗口,一个临时窗口,显示主父窗口(JFrame窗口)中未显示的信息,因此它应该显示在JDialog中,而不是JFrame中
例如:

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

@SuppressWarnings("serial")
public class CreatingSpeciesPanel extends JPanel {
    public static final String INITIALIZING = "Initializing...";
    public static final String DONE = "DONE!";
    private static final int PREF_W = 480;
    private static final int PREF_H = 150;
    private static final int GAP = 20;
    private static final float TITLE_SIZE = 24f;

    private JLabel title = new JLabel(INITIALIZING, SwingConstants.CENTER);
    private JProgressBar progressBar = new JProgressBar();

    public CreatingSpeciesPanel() {
        title.setFont(title.getFont().deriveFont(Font.BOLD, TITLE_SIZE));
        progressBar.setValue(0);
        progressBar.setStringPainted(true);

        JPanel centerPanel = new JPanel(new BorderLayout());
        centerPanel.add(progressBar, BorderLayout.PAGE_END);

        setLayout(new BorderLayout());
        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        add(title, BorderLayout.PAGE_START);
        add(centerPanel, BorderLayout.CENTER);

    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    public void setValue(int value) {
        progressBar.setValue(value);
    }

    public void setTitleLabelText(String text) {
        title.setText(text);
    }

    private static void createAndShowGui() {
        final CreatingSpeciesPanel creatingSpeciesPanel = new CreatingSpeciesPanel();
        final JFrame mainFrame = new JFrame("Main Frame");

        JButton createSpeciesBtn = new JButton(new AbstractAction("Create Species") {

            @Override
            public void actionPerformed(ActionEvent e) {
                creatingSpeciesPanel.setTitleLabelText(CreatingSpeciesPanel.INITIALIZING);
                final JDialog dialog = new JDialog(mainFrame, "Creating Species", ModalityType.APPLICATION_MODAL);
                dialog.add(creatingSpeciesPanel);
                dialog.pack();
                dialog.setLocationRelativeTo(mainFrame);

                new Timer(200, new ActionListener() {
                    private int doneCount = 0;
                    private int value = 0;
                    private static final int MAX_DONE_COUNT = 10;

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (value < 100) {

                            value += (int) Math.random() * 5 + 5;
                            value = Math.min(100, value);

                            creatingSpeciesPanel.setValue(value);
                            if (value == 100) {
                                creatingSpeciesPanel.setTitleLabelText(CreatingSpeciesPanel.DONE);
                            }
                        } else {
                            // let's display the dialog for 2 more seconds
                            doneCount++;
                            if (doneCount >= MAX_DONE_COUNT) {
                                ((Timer) e.getSource()).stop();
                                dialog.setVisible(false);
                            }
                        }
                    }
                }).start();

                dialog.setVisible(true);
            }
        });

        JPanel panel = new JPanel();
        panel.add(createSpeciesBtn);
        panel.setPreferredSize(new Dimension(500, 400));

        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.getContentPane().add(panel);
        mainFrame.pack();
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.Font;
导入java.awt.Dialog.ModalityType;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
@抑制警告(“串行”)
公共类CreatingSpeciesPanel扩展了JPanel{
公共静态最终字符串初始化=“初始化…”;
公共静态最终字符串DONE=“DONE!”;
专用静态最终整型预调W=480;
私有静态最终整型参数H=150;
专用静态最终内部间隙=20;
专用静态最终浮动标题_尺寸=24f;
私有JLabel title=新JLabel(初始化,SwingConstants.CENTER);
private JProgressBar progressBar=新的JProgressBar();
公共创建规范小组(){
title.setFont(title.getFont().deriveFont(Font.BOLD,title_SIZE));
progressBar.setValue(0);
progressBar.SetStringPaint(真);
JPanel centerPanel=newjpanel(newborderlayout());
中心面板。添加(进度条、边框布局。第页\结束);
setLayout(新的BorderLayout());
setBorder(BorderFactory.createEmptyByOrder(间隙,间隙,间隙));
添加(标题、边框布局、页首);
添加(中心面板,BorderLayout.CENTER);
}
@凌驾
公共维度getPreferredSize(){
如果(isPreferredSizeSet()){
返回super.getPreferredSize();
}
返回新维度(PREF_W,PREF_H);
}
公共无效设置值(int值){
progressBar.setValue(值);
}
public void setTitleLabelText(字符串文本){
title.setText(文本);
}
私有静态void createAndShowGui(){
最终创建规格面板创建规格面板=新建规格面板();
最终JFrame大型机=新JFrame(“主框架”);
JButton createSpeciesBtn=新JButton(新抽象动作(“创建物种”){
@凌驾
已执行的公共无效操作(操作事件e){
creatingSpeciesPanel.setTitleLabelText(creatingSpeciesPanel.INITIALIZING);
最终JDialog对话框=新JDialog(大型机,“创建物种”,ModalityType.APPLICATION\u MODAL);
添加(创建规格面板);
dialog.pack();
对话框。setLocationRelativeTo(大型机);
新计时器(200,新ActionListener(){
私有int doneCount=0;
私有int值=0;
私有静态最终整数最大完成计数=10;
@凌驾
已执行的公共无效操作(操作事件e){
如果(值<100){
value+=(int)Math.random()*5+5;
数值=数学最小值(100,数值);
创建SpeciesPanel.setValue(值);
如果(值==100){
creatingSpeciesPanel.setTitleLabelText(creatingSpeciesPanel.DONE);
}
}否则{
//让我们再显示两秒钟对话框
donecoount++;
如果(完成计数>=最大完成计数){
((计时器)e.getSource()).stop();
对话框.setVisible(false);
}
}
}
}).start();
对话框.setVisible(true);
}
});
JPanel面板=新的JPanel();
panel.add(createSpeciesBtn);
面板。设置首选尺寸(新尺寸(500400));
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.getContentPane().add(面板);
mainFrame.pack();
mainFrame.setLocationRelativeTo(空);
mainFrame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
问题:

  • 您正在使用绝对定位设置大小和位置——不要这样做,因为Swing不是这样工作的,这将导致GUI很难维护和增强,正如您所发现的那样
  • 构造JLabel时,请使用
    SwingConstants.CENTER
    int使其文本居中
  • 将其添加到使用BorderLayout的容器中,可能位于
    BorderLayout.PAGE\u START
    位置
  • 不相关的问题--不要这样做:
    i