【问题标题】:How to recreate this progress bar based JFrame?如何重新创建这个基于 JFrame 的进度条?
【发布时间】:2017-04-14 11:05:00
【问题描述】:

我想创建一个JFrame,我刚刚找到了完美的框架。 我想重新创建这个:

获取此帧的代码如下所示:

progressBar = new JProgressBar();
statusLbl = new JLabel();
statusLbl1 = new JLabel();
percentLbl = new JLabel();

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setTitle("Auto-Updater");
addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent evt) {
    formWindowClosing(evt);
    }
});
statusLbl.setText("Status:");
statusLbl1.setText("N/A");
percentLbl.setText("0%");
GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);

layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(
    layout.createSequentialGroup()
    .addContainerGap()
    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(statusLbl).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(statusLbl1).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 304, 32767)
            .addComponent(percentLbl)).addComponent(progressBar, GroupLayout.Alignment.TRAILING, -1, 380, 32767))
    .addContainerGap()));

layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(
    layout.createSequentialGroup()
    .addContainerGap()
    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
        .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
            .addComponent(statusLbl1, -1, -1, 32767)
            .addComponent(percentLbl))
        .addComponent(statusLbl, -1, -1, 32767)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(progressBar, -2, 30, -2).addContainerGap(-1, 32767)));

pack();

但我认为这看起来很难看,可读性为零,所以我问你:如何使用不同的布局重新创建此框架,或者如何使用不同的布局使其可读?

【问题讨论】:

  • “如果您将状态:N/A 更改为 TitledBorder”是什么意思
  • 好吧,我刚刚发现了什么是 TitledBorder,但我真的很喜欢 JFrame 的设计,就像现在一样。不过,我可以将百分比放在进度条中。顺便说一句,这个 JFrame 可以用任何布局制作吗?
  • 抱歉浪费了您的时间。在回复您的评论之前,我应该先查一下。
  • 一种成熟的复杂布局技术是不要在单个布局中使用单个JPanel。而是使用多个嵌套的JPanels,每个都有不同的布局管理器。一篇很好的文章是Effective Layout Management
  • @ThomasFritsch 好点。这里是another example of combining layouts

标签: java swing jframe layout-manager grouplayout


【解决方案1】:

如果进度字符串可以包含在进度条中,则可以使用单个JPanelBorderLayout 来完成。将标签放在PAGE_START 中,将进度条放在CENTER 中(如果未指定约束,则为默认值)。

注意:我倾向于以JDialogJOptionPane 而不是JFrame 显示该面板,但这里是基于框架的版本。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ProgressBarPanel {

    private JComponent ui = null;

    ProgressBarPanel() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        JProgressBar progressBar = new JProgressBar(0, 100) {
            public Dimension getPreferredSize() {
                // base this on a multiple of the default preferred size to
                // account for the size of the font used to paint the 
                // progress string
                return new Dimension(400,40);
            }
        };
        progressBar.setValue(50);
        progressBar.setStringPainted(true);
        ui.add(progressBar);

        ui.add(new JLabel("Status: N/A"), BorderLayout.PAGE_START);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ProgressBarPanel o = new ProgressBarPanel();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

  • 非常感谢这个例子。我会看看我是否能理解这一切。我会好好利用这个的。
  • “我看看我能不能全部理解。” 重要的部分在initUI()方法中,即使它可以被缩短以删除覆盖的方法放大进度条的大小。
  • 啊,我明白了。非常感谢你帮助我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2012-05-04
  • 1970-01-01
相关资源
最近更新 更多