【问题标题】:Show progress bar after an action动作后显示进度条
【发布时间】:2015-10-22 11:38:32
【问题描述】:

我想在某些操作后显示进度条。 实际代码很复杂,但我准备了一个示例 我希望进度条填充框架的宽度,但我希望它具有特定/正常的高度而不是填充框架。我怎样才能做到这一点? 如果框架的布局没有改变(BorderLayout)会更好,因为它可能会破坏我的实际代码中的其他内容。如果这无法避免,那么一定要改变它,我会看看它会发生什么。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Timer;

public class SwingControlDemo
{

    public static int progress = 0;
    private JFrame mainFrame;

    public SwingControlDemo()
    {
        prepareGUI();
    }

    public static void main(String[] args)
    throws Exception
    {
        //BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;
       // org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
        new SwingControlDemo();
    }

    private void prepareGUI()
    {
        mainFrame = new JFrame("Java Swing Examples");
        mainFrame.setSize(400, 400);
        mainFrame.setLayout(new BorderLayout());
        mainFrame.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent windowEvent)
            {
                System.exit(0);
            }
        });
        JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                showProgressBarDemo();
            }
        });

        mainFrame.add(new JLabel("mplaaaaaaaaaaaaaaaaaaa"), BorderLayout.CENTER);
        mainFrame.add(startButton, BorderLayout.SOUTH);
        mainFrame.setVisible(true);
    }

    private void showProgressBarDemo()
    {
        final JProgressBar progressBar = new JProgressBar(0, 100);
        progressBar.setValue(0);
        progressBar.setStringPainted(true);

        JPanel controlPanel = new JPanel();
        controlPanel.setLayout(new BorderLayout());
        controlPanel.add(progressBar, BorderLayout.CENTER);

        mainFrame.add(controlPanel);
        mainFrame.revalidate();
        mainFrame.repaint();

        final Timer timer = new Timer(1000, new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {   
                progress++;
                System.out.println(String.format("Completed %d%% of task.\n", progress));
                progressBar.setValue(progress);
                progressBar.setString(String.format("Completed %d%% of task.\n", progress));
            }
        });

        timer.start();
    }
}

【问题讨论】:

    标签: java swing progress-bar


    【解决方案1】:

    实际代码很复杂,但我准备了一个示例,我希望进度条填充框架的宽度,但我希望它具有特定/正常的高度而不是填充框架。

    例如,您可以使用GridBagLayout

    JPanel controlPanel = new JPanel();
    controlPanel.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.weightx = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    controlPanel.add(progressBar, gbc);
    

    详情请见How to Use GridBagLayout

    您可以考虑利用框架的“玻璃窗格”,它允许您将内容放在contentPane 的顶部,但不会直接影响它。如果您向其注册了MouseListener,您甚至可以阻止鼠标事件通过contentPane 本身。

    查看How to Use Root Panes了解更多详情

    另外,根据您的需要,您也许可以使用ProgressMonitorfor example

    【讨论】:

      【解决方案2】:

      但我希望它具有特定/正常的高度

      如果您希望它显示在其preferredSize 上,而不是将其添加到使用 FlowLayout 的 JPanel,然后将该 JPanel 添加到使用 BorderLayout 的 JPanel 中(如果您希望仍然有一个 BorderLayout)。请注意,我会使用 CardLayout 交换组件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 2014-05-25
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        相关资源
        最近更新 更多