2015-01-25 6 views
1

Существует класс, который распространяется на JFrame. затем Далее JFrame имеют JPanel с именем contentPane, и этот Jpanel содержит еще 2 jpanel. как показано на рисунке.Как Центрировать Jpanel в JFrame?

Here is the Image

Хочу Центр, который ContentPane в JFrame так, что при изменении размера JFrameJPanel (ContentPane) будет оставаться в центре. Я пробовал с разными Layouts, но не придумал правильный. там в любом случае ? Изображение полного изображения here

Код - это.

public class Purchases extends JFrame { 

    private JPanel contentPane; 

public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Purchases frame = new Purchases(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 


     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 513, 438); 


     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 
     setLocationRelativeTo(null); 



     JPanel panel = new JPanel(); 
     panel.setBounds(10, 10, 477, 193); 
     contentPane.add(panel); 
     panel.setLayout(null); 

     JPanel panel_1 = new JPanel(); 
     panel_1.setBounds(10, 214, 477, 174); 
     contentPane.add(panel_1); 
     panel_1.setLayout(null); 

} 

Этот код автоматически генерируется Eclipse. Я не нашел, где contentPane добавляется в JFrame.

+0

Вы просто хотите центрировать панель, чтобы при изменении размера (jframe становится больше) есть пустая граница со всех сторон? это кажется немного неестественным для меня – maffelbaffel

+0

, если есть пустые границы, я увеличу размер JPanel. Повреждение должно сосредоточиться. размер i будет обрабатывать –

+0

Добавьте панель в виде одного компонента в «GridBagLayout», который будет центрировать его. НАПРИМЕР. как показано в [этом ответе] (http://stackoverflow.com/a/9090772/418556). –

ответ

-1

Я думаю, вы должны установить максимальный размер элемента & установить его выравнивание по центру:

setAlignmentX(JComponent.CENTER_ALIGNMENT); 
setMaximumSize(new Dimension(100, 100)); 

Как объяснено здесь: How can I properly center a JPanel (FIXED SIZE) inside a JFrame?

+0

Позвольте мне посмотреть, помогает ли это –

+0

См. [Следует ли избегать использования методов размера (Предпочтительный | Максимальный | Минимум) в Java Swing?] (Http://stackoverflow.com/ q/7229226/418556) (Да.) –

+0

не работает с ним. Дать ошибки в строке run() –

3

Установить макет фрейма в GridBagLayout. Оберните существующий контент в другом JPanel, добавьте эту панель к раме

Для example

Взгляните на Laying Out Components Within a Container и How to Use GridBagLayout для получения более подробной информации

Вы действительно должны избегать использования null макетов, пиксельные совершенные макеты иллюзия в современном дизайне ui. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбрасывая их, что не приведет к проблемам и проблемам, которые вы потратите все больше времени на исправление.

0

Я сделал образец для вас. Измените его в соответствии с вашими потребностями. Просто хочу показать вам, что вы хотите, работает.

TestClass() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 513, 438); 

     contentPane = new JPanel(); 
     contentPane.setLayout(new BorderLayout()); 

     JButton b1 = new JButton("hello"); 
     JPanel panel = new JPanel(new BorderLayout()); 
     //panel.setBounds(10, 10, 477, 193); 
     panel.add(b1, BorderLayout.CENTER); 
     contentPane.add(panel, BorderLayout.EAST); 
     //panel.setLayout(null); 

     JButton b2 = new JButton("why"); 
     JPanel panel_1 = new JPanel(new BorderLayout()); 
     //panel_1.setBounds(10, 214, 477, 174); 
     panel_1.add(b2, BorderLayout.CENTER); 
     contentPane.add(panel_1, BorderLayout.WEST); 
     //panel_1.setLayout(null); 

     this.getContentPane().add(contentPane); 
    } 

Надеюсь, это поможет. :-)

Смежные вопросы