【问题标题】:Resize JProgressBar if JFrame resizes如果 JFrame 调整大小,则调整 JProgressBar 的大小
【发布时间】:2015-10-16 11:23:12
【问题描述】:

我想在调整 JFrame 大小时调整 JProgresbar 的大小

我的 JProgresBar 的大小是这样计算的:

progressBar.setPreferredSize(new Dimension(getWidth() - 100, 50));

但是当我调整 JFrame 的大小时,进度条的大小将始终保持不变。

更新 1

这是我的代码:

public class MinimalExampleJProgresbar {
    public static void main(String[] args) {
        JFrame frame = new JFrame("SimpleFrame");
        JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JProgressBar progressBar = new JProgressBar();

        jPanel.add(progressBar);
        frame.add(jPanel, BorderLayout.PAGE_START);

        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        frame.setVisible(true);
        progressBar.setPreferredSize(new Dimension(frame.getWidth() - 100, 50));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

【问题讨论】:

    标签: java swing resize jframe jcomponent


    【解决方案1】:

    使用布局管理器对您有利。例如,JFrame 的 contentPane 使用 BorderLayout。如果您将 JProgressBar 添加到此、BorderLayout.PAGE_END 或 BorderLayout.PAGE_END 位置,它将在其容器调整大小时自动调整大小。

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    
    public class SimpleFrame {
       private static void createAndShowGUI() {
          final JProgressBar progressBar = new JProgressBar(0, 100);
          progressBar.setBorder(BorderFactory.createTitledBorder("My Progress"));
          new Timer(200, new ActionListener() {
             int value = 0;
    
             @Override
             public void actionPerformed(ActionEvent e) {
                value += 10;
                if (value > 100) {
                   value = 0;
                }
                progressBar.setValue(value);
             }
          }).start();
    
    
          JFrame frame = new JFrame("SimpleFrame");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.add(progressBar, BorderLayout.PAGE_START);
          frame.add(Box.createRigidArea(new Dimension(400, 300)));
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGUI();
             }
          });
       }
    }
    

    import java.awt.*;
    import javax.swing.*;
    
    public class MinimalExampleJProgresbar2 {
       public static void main(String[] args) {
           JFrame frame = new JFrame("SimpleFrame");
           JPanel wrapperPanel = new JPanel(new BorderLayout());
    
           JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
           JProgressBar progressBar = new JProgressBar();
    
           wrapperPanel.add(progressBar, BorderLayout.PAGE_START);
           wrapperPanel.add(jPanel, BorderLayout.CENTER);
    
           frame.add(wrapperPanel, BorderLayout.PAGE_START);
    
           frame.setExtendedState(Frame.MAXIMIZED_BOTH);
           frame.setVisible(true);
           progressBar.setPreferredSize(new Dimension(frame.getWidth() - 100, 50));
           frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
       }
    }
    

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;    
    import javax.swing.*;
    
    public class MinimalExampleJProgresbar2 {
       public static void main(String[] args) {
           JFrame frame = new JFrame("SimpleFrame");
           JPanel wrapperPanel = new JPanel(new BorderLayout());
    
           JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
           final JProgressBar progressBar = new JProgressBar();
    
           new Timer(200, new ActionListener() {
              int value = 0;
    
              @Override
              public void actionPerformed(ActionEvent e) {
                 value += 10;
                 if (value > 100) {
                    value = 0;
                 }
                 progressBar.setValue(value);
              }
           }).start();
    
           JPanel boxUser = new JPanel();
           boxUser.setLayout(new BoxLayout(boxUser, BoxLayout.LINE_AXIS));
           boxUser.add(Box.createHorizontalStrut(50));
           boxUser.add(progressBar);
           boxUser.add(Box.createHorizontalStrut(50));
    
    
           wrapperPanel.add(boxUser, BorderLayout.PAGE_START);
           wrapperPanel.add(jPanel, BorderLayout.CENTER);
    
           frame.add(wrapperPanel, BorderLayout.PAGE_START);
    
           frame.setExtendedState(Frame.MAXIMIZED_BOTH);
           frame.setVisible(true);
           frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
       }
    }
    

    【讨论】:

    • 我的组件被添加到在 PAGE_START 上设置的 JPanel。 JPanel 的布局管理器是 FlowLayout.Left
    • @KoenVanLooveren:不要那样做,不要将它添加到使用 FlowLayout 的容器中。您可以嵌套 JPanel,每个都使用不同的布局,这样可以解决您的问题。如果您需要进一步的帮助,请创建并发布您的 minimal reproducible example,类似于我在上面发布的代码。
    • @KoenVanLooveren: 我也是 :)
    • 不行,这还是同样的问题,我要左右各50个空格。如果你运行我的代码,就会有一个空格。在您的解决方案中没有空格
    • 好吧,我明白了,但是在这个例子中我不能设置进度条的高度?非常感谢你帮助我
    【解决方案2】:

    在你的框架中添加一个 ComponentAdapter

    myFrame.addComponentListener(new ComponentAdapter() {
      public void componentResized(ComponentEvent ev) {
        progressBar.setPreferredSize(new Dimension(getWidth() - 100, 50));
        revalidate();
        repaint();
      }
    });
    

    【讨论】:

    • @KoenVanLooveren:我没有否决这个答案,但是当存在更好的解决方案时,它更像是一个杂牌。为了获得最佳解决方案,再次显示您的代码,minimal reproducible example
    • 是的,但是在你的解决方案中,progresbare 长度不能像我想要的那样计算,并且使用@ControlAltDel 的解决方案是可能的
    • @KoenVanLooveren:使用我的解决方案,进度条长度不需要计算。同样,为什么不创建并发布您的minimal reproducible example?同样,为什么不让我们使用您的代码来找到最佳解决方案?
    • 我仍然认为这是最好的方法,但感谢您的反应
    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多