2015-10-16 141 views
4

我想调整我JProgresbar当我调整我的JFrame调整大小的JProgressBar如果JFrame的大小调整

我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); 
    } 
} 

回答

1

添加ComponentAdapter到你的框架

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

tnx男人!它解决了 –

+0

为什么这是downvoted? –

+0

@KoenVanLooveren:我没有对这个答案投下赞成票,但是当更好的解决方案存在时,它更像是一团糟。为了最好的解决方案,再次显示你的代码,你的[mcve]。 –

3

使用布局管理器,你的优势。例如,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); 
    } 
} 
+0

我的组件添加到正在上PAGE_START设置一个JPanel。 JPanel的布局管理器是FlowLayout.Left –

+1

@KoenVanLooveren:不要这样做,不要将它添加到使用FlowLayout的容器中。您可以嵌套JPanel,每个都使用不同的布局,并以此方式解决您的问题。如果您需要更多帮助,请创建并发布您的[mcve],与我上面发布的代码类似。 –

+0

我刚刚更新了我的帖子 –