2014-01-28 46 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

你需要它影響各個組件如何變化作出反應的大小父容器和多少「重GridBagConstraints提供weightxweighty值「特定小區

內佔用看看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

我會考慮使用嵌套的使用BorderLayouts的JPanel。例如:

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+優秀答案的人。 –

+1

就個人而言,我更喜歡在複雜的'GridBagLayout'上儘可能地使用複合佈局,如果以後要更改它就更容易處理 - 恕我直言 – MadProgrammer

相關問題