2015-10-16 3 views
4

Я хочу, чтобы изменить свою JProgresbar, когда я изменить размер моего JFrameResize JProgressBar если JFrame изменяет

размер моего JProgresBar рассчитывается следующим образом:

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

, но когда я изменить размер моего JFrame размер самого progressbar всегда останется неизменным.

UPDATE 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 man! Выработало –

+0

почему это было downvoted? –

+0

@KoenVanLooveren: Я не проголосовал за этот ответ, но это больше похоже на то, когда существуют лучшие решения. Для лучшего решения, еще раз, покажите свой код, ваш [mcve]. –

3

менеджеры Использование макета в вашу пользу. Например, в контентной панели JFrame используется 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

мой компонент добавляется к JPanel, который устанавливается на PAGE_START. Менеджером макета JPanel является FlowLayout.Left –

+1

@KoenVanLooveren: не делайте этого, не добавляйте его в контейнер FlowLayout. Вы можете вложить JPanels, каждый из которых использует другой макет, и таким образом решить вашу проблему. Если вам нужна дополнительная помощь, создайте и опубликуйте свой [mcve], как и код, который я опубликовал выше. –

+0

Я только что обновил свой пост –