java - JProgressBar 被不正确地压缩/调整大小

标签 java swing gridbaglayout jprogressbar preferredsize

我在我的 Swing gui 上使用了一个 JProgressBar:

当我在使用 progressBar.setValue() 更新时最小化窗口时,它将像这样压缩:

请注意,调整大小或类似操作并不能解决问题。

为什么会发生,如何预防?是什么原因造成的?我希望进度条保持与第一张图片相同的大小。

我正在使用 GridBagLayout

重现代码:

import javax.swing.JFrame;
import javax.swing.SwingWorker;

import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.JProgressBar;

import java.awt.GridBagConstraints;

import javax.swing.JButton;

import java.awt.Insets;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;

@SuppressWarnings("serial")
public class ProgressBarSqueezeFixedExample extends JFrame
{
    public ProgressBarSqueezeFixedExample()
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500, 500);
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[] { 0, 0, 0 };
        gridBagLayout.rowHeights = new int[] { 0, 0, 0, 0, 0 };
        gridBagLayout.columnWeights = new double[] { 1.0, 0.0, Double.MIN_VALUE };
        gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 1.0,
                Double.MIN_VALUE };
        getContentPane().setLayout(gridBagLayout);

        JProgressBar progressBar = new JProgressBar();

        JTextArea textArea = new JTextArea();

        JButton btnRun = new JButton("Run");
        setPreferredSize(new Dimension(200, 200));

        btnRun.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                SwingWorker<String, String> worker = new SwingWorker<String, String>()
                {
                    @Override
                    protected String doInBackground() throws Exception
                    {
                        for (int i = 0; i < 10001; i++)
                        {
                            try
                            {
                                Thread.sleep(1);
                            } catch (InterruptedException e)
                            {
                                e.printStackTrace();
                            }

                            progressBar.setValue(i);
                            progressBar.setString(i + " %");

                            textArea.append(i + System.lineSeparator());
                        }

                        return null;
                    }
                };

                worker.execute();
            }
        });
        GridBagConstraints gbc_btnRun = new GridBagConstraints();
        gbc_btnRun.insets = new Insets(0, 0, 5, 5);
        gbc_btnRun.gridx = 0;
        gbc_btnRun.gridy = 0;
        getContentPane().add(btnRun, gbc_btnRun);

        JLabel lblProgress = new JLabel("Progress");
        GridBagConstraints gbc_lblProgress = new GridBagConstraints();
        gbc_lblProgress.insets = new Insets(0, 0, 5, 5);
        gbc_lblProgress.gridx = 0;
        gbc_lblProgress.gridy = 1;
        getContentPane().add(lblProgress, gbc_lblProgress);

        progressBar.setMaximum(10000);
        progressBar.setStringPainted(true);
        progressBar.setMinimumSize(progressBar.getPreferredSize()); // Fixes squeezing issues

        GridBagConstraints gbc_progressBar = new GridBagConstraints();
        gbc_progressBar.insets = new Insets(0, 0, 5, 5);
        gbc_progressBar.gridx = 0;
        gbc_progressBar.gridy = 2;
        getContentPane().add(progressBar, gbc_progressBar);

        JScrollPane scrollPane = new JScrollPane();
        GridBagConstraints gbc_scrollPane = new GridBagConstraints();
        gbc_progressBar.fill=GridBagConstraints.HORIZONTAL; // Alternate fix
        gbc_scrollPane.gridwidth = 2;
        gbc_scrollPane.fill = GridBagConstraints.BOTH;
        gbc_scrollPane.gridx = 0;
        gbc_scrollPane.gridy = 3;
        getContentPane().add(scrollPane, gbc_scrollPane);

        scrollPane.setViewportView(textArea);
        pack();

        setVisible(true);
    }

    public static void main(String[] args)
    {
        new ProgressBarSqueezeFixedExample();
    }
}

gui 的大小调整和进度条的压缩必须与 textArea append() 看起来的方式有关。

最佳答案

使用GridBagConstraints#fill当组件的显示区域大于组件请求的大小时使用的属性。它决定是否调整组件的大小。

gbc_progressBar.fill=GridBagConstraints.HORIZONTAL;

注意:无需创建多个 GridBagConstraints 实例。您也可以使用单个对象实现相同的目的。

阅读更多关于 How to Use GridBagLayout 的信息并查看示例。

关于java - JProgressBar 被不正确地压缩/调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25055992/

相关文章:

java - 如何在 GridBagLayout 单元格内左对齐或右对齐?

java - 显示 JComboBox 中的第一个元素

java - Shell 将参数传递给带参数运行的 java

java - JTable 鼠标监听器无法正常工作

java - 我的 JButton 在 Java 中的外观存在问题

java - 使用 GridBagLayout (Java) 构建 GUI

java - GridBagLayout 左对齐

java - 如何使用 Guava 将 Iterable<Map.Entry<A,B>> 转换为 Map<A,B>?

java - 使用 jsonschema2pojo 转换可变长度值的枚举

java - JOptionPane.showInternalMessageDialog 导致运行时错误