2014-01-28 5 views
0

Это то, что я пытаюсь достичьJava GridBagLayout изменение размера и фиксированного размера

------------------------| 150px | 
|      | width | 
|      | p2 | 
|      |  | 
|  Fill frame  |  | 
|  p1    |  | 
|      |  | 
|      |  | 
------------------------|  | 
150px height   |  | 
|  p3    |  | 
--------------------------------- 

«Заполнить кадр» имеет масштаб динамический, но другие два квадрата имеют фиксированную ширину/высоту.

Мой код действительно создает этот макет, но p1 не масштабируется, чтобы заполнить весь кадр. Может ли кто-нибудь рассказать мне, как сделать p1 динамическим?

Заранее спасибо.

Это то, что я до сих пор:

setTitle(Rolit.TITLE); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    mainPanel = new JPanel(); 
    mainPanel.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 

//P1 FILL P1 WITH 64 BUTTONS 
    p1 = new JPanel(); 
    p1.setLayout(new GridLayout(8, 8)); 

    p1.setMinimumSize(new Dimension(600, 600)); 
    p1.setMaximumSize(new Dimension(600, 600)); 
    p1.setPreferredSize(new Dimension(600, 600)); 

    for(int y = 0; y < 8; y++){ 
     for(int x = 0; x < 8; x++){ 
      JButton btn = new JButton(x + " , " + y); 
      p1.add(btn); 
     } 
    } 

//P2 FILL P2 WITH 4 BUTTONS 
    p2 = new JPanel(); 
    p2.setLayout(new GridLayout(4, 1)); 
    p2.setMinimumSize(new Dimension(150, 100)); 
    p2.setMaximumSize(new Dimension(150, 100)); 
    p2.setPreferredSize(new Dimension(150, 100)); 

    for(int i = 0; i < 4; i++){ 
     p2.add(new JButton("Button")); 
    } 

//P3 
    p3 = new JPanel(); 
    p3.setMinimumSize(new Dimension(100, 150)); 
    p3.setMaximumSize(new Dimension(100, 150)); 
    p3.setPreferredSize(new Dimension(100, 150)); 
    p3.setBackground(Color.BLUE); 


//ADD ALL TO mainPanel 

    c.gridx = 0; 
    c.gridy = 0; 
    c.fill = GridBagConstraints.BOTH; 
    mainPanel.add(p1, c);   

    c.gridx = 1; 
    c.gridheight = 2; 
    c.fill = GridBagConstraints.VERTICAL; 
    mainPanel.add(p2, c); 

    c.gridx = 0; 
    c.gridy = 1; 
    c.gridheight = 1;   
    c.gridwidth = 2; 
    c.fill = GridBagConstraints.HORIZONTAL; 
    mainPanel.add(p3, c); 

    setContentPane(mainPanel); 
    pack(); 
    setLocationRelativeTo(null); 
    setVisible(true); 

ответ

2

Вам необходимо предоставить weightx и weighty значения с GridBagConstraints, которые влияют как отдельные компоненты реагируют на изменения размера родительского контейнера и сколько «вес "приемный вверх в пределах данной ячейки

Посмотрите на How to use GridBagLayout для получения более подробной информации

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestGridBagLayout { 

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

    private JPanel mainPanel; 
    private JPanel p1; 
    private JPanel p2; 
    private JPanel p3; 

    public TestGridBagLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       mainPanel = new JPanel(); 
       mainPanel.setLayout(new GridBagLayout()); 
       GridBagConstraints c = new GridBagConstraints(); 

       //P1 FILL P1 WITH 64 BUTTONS 
       p1 = new JPanel(); 
       p1.setLayout(new GridLayout(8, 8)); 

       p1.setMinimumSize(new Dimension(600, 600)); 
       p1.setMaximumSize(new Dimension(600, 600)); 
       p1.setPreferredSize(new Dimension(600, 600)); 

       for (int y = 0; y < 8; y++) { 
        for (int x = 0; x < 8; x++) { 
         JButton btn = new JButton(x + " , " + y); 
         p1.add(btn); 
        } 
       } 

       //P2 FILL P2 WITH 4 BUTTONS 
       p2 = new JPanel(); 
       p2.setLayout(new GridLayout(4, 1)); 
       p2.setMinimumSize(new Dimension(150, 100)); 
       p2.setMaximumSize(new Dimension(150, 100)); 
       p2.setPreferredSize(new Dimension(150, 100)); 

       for (int i = 0; i < 4; i++) { 
        p2.add(new JButton("Button")); 
       } 

       //P3 
       p3 = new JPanel(); 
       p3.setMinimumSize(new Dimension(100, 150)); 
       p3.setMaximumSize(new Dimension(100, 150)); 
       p3.setPreferredSize(new Dimension(100, 150)); 
       p3.setBackground(Color.BLUE); 

       //ADD ALL TO mainPanel 
       c.gridx = 0; 
       c.gridy = 0; 
       c.fill = GridBagConstraints.BOTH; 
       c.weightx = 1; 
       c.weighty = 1; 
       mainPanel.add(p1, c); 

       c.gridx = 1; 
       c.gridheight = 2; 
       c.weighty = 1; 
       c.weightx = 0; 
       c.fill = GridBagConstraints.VERTICAL; 
       mainPanel.add(p2, c); 

       c.gridx = 0; 
       c.gridy = 1; 
       c.gridheight = 1; 
       c.gridwidth = 2; 
       c.fill = GridBagConstraints.HORIZONTAL; 
       c.weighty = 0; 
       c.weightx = 1; 
       mainPanel.add(p3, c); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(mainPanel); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
3

Я бы рассмотрел использование вложенных JPanels, которые используют BorderLayouts. Например:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class EmielGui extends JPanel { 
    protected static final int DELTA_DIMEN = 1; 
    protected static final int MAX_DIMEN = 600; 
    private static final int DELAY = 20; 
    private JPanel rightPanel = new JPanel(); 
    private JPanel bottomPanel = new JPanel(); 
    private JPanel centerPanel = new JPanel(); 
    private int dimen = 100; 

    public EmielGui() { 
     JPanel tempCenterPanel = new JPanel(new BorderLayout()); 
     tempCenterPanel.add(centerPanel, BorderLayout.CENTER); 
     tempCenterPanel.add(bottomPanel, BorderLayout.SOUTH); 

     setLayout(new BorderLayout()); 
     add(rightPanel, BorderLayout.EAST); 
     add(tempCenterPanel, BorderLayout.CENTER); 

     rightPanel.setMinimumSize(new Dimension(150, 0)); 
     bottomPanel.setMinimumSize(new Dimension(0, 150)); 

     rightPanel.setPreferredSize(rightPanel.getMinimumSize()); 
     bottomPanel.setPreferredSize(bottomPanel.getMinimumSize()); 

     rightPanel.setBorder(BorderFactory.createLineBorder(Color.red)); 
     bottomPanel.setBorder(BorderFactory.createLineBorder(Color.blue)); 
     centerPanel.setBorder(BorderFactory.createLineBorder(Color.green)); 

     new Timer(DELAY, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      dimen += DELTA_DIMEN; 
      if (dimen < MAX_DIMEN) { 
       centerPanel.setPreferredSize(new Dimension(dimen, dimen)); 
       SwingUtilities.getWindowAncestor(EmielGui.this).pack(); 

      } else { 
       ((Timer) e.getSource()).stop(); 
      } 
     } 
     }).start(); 
    } 

    private static void createAndShowGui() { 
     EmielGui mainPanel = new EmielGui(); 

     JFrame frame = new JFrame("EmielGui"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+1

+1 для альтернативы – MadProgrammer

+0

@MadProgrammer: спасибо. Я был первым, кто ответил на ваш ответ за то, что был отличным, как обычно. –

+1

Лично я предпочитаю использовать сложные макеты над сложным «GridBagLayout», где это возможно, с чем легче справиться, если вы хотите изменить его позже - IMHO – MadProgrammer

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