2017-07-19 87 views
0

我有两个面板。第一个看起来像这样。面板占用相等的空间

public class BoardPanel extends JPanel 
{ 
    public BoardPanel() 
    { 
     setLayout(null); 
     this.setOpaque(false); 

     Button button = new JButton(".."); 
     button.setLocation(...); 
     button.setSize(...); 
     add(button); 
    } 

    public void paintComponent(Graphics g) 
    { 
     /* 
     * Painting some stuff here. 
     */ 
    } 
} 

其他面板是这样的:

public class OtherPanel extends JPanel 
{ 
    public OtherPanel() 
    { 
     super(); 
     this.setLayout(null); 
     this.setOpaque(false); 

     JPanel panel1 = new JPanel(); 
     panel1.setLocation(...); 
     panel1.setSize(...); 
     panel1.setOpaque(..); 

     JPanel panel2 = new JPanel(); 
     panel2.setLocation(...); 
     panel2.setSize(...); 
     panel2.setOpaque(..); 

     add(panel1): 
     add(panel2); 
    } 

} 

在那之后,我把我的两个面板在框架中。但是我希望我的BoardPanel占据比OtherPanel更多的屏幕。所以我用的GridBagLayout的框架

public class MainFrame extends JFrame 
{ 
    private GridBagLayout aGridLayout = new GridBagLayout(); 
    private GridBagConstraints constraints = new GridBagConstraints(); 

    public MainFrame() 
    { 
     super("Quoridor"); 
     setLayout(gridLayout); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(1366, 768); 
     setVisible(true); 
     setResizable(false); 
     this.getContentPane().setBackground(Color.decode("#b2a6a6")); 

     BoardPanel boardPanel = new BoardPanel(); 
     OtherPanel otherPanel = new OtherPanel(); 

     this.addComponent(boardPanel, 1, 1, 2, 1); 
     this.addComponent(otherPanel, 1, 3, 1, 1); 
    } 

    public void addComponent(Component component , int row , int column , int width 
      , int height) 
    { 
     constraints.gridx = column; 
     constraints.gridy = row; 
     constraints.gridwidth = width; 
     constraints.gridheight = height; 
     aGridLayout.setConstraints(component, constraints); 
     add(component); 
    } 
} 

的问题是,该框架给予同等的空间来同时面板,不给boardPanel给予更多的空间。 这是怎么回事?做它必须做的面板的界限?

回答

1

这是关于GridBagLayout的一个很好的教程:https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html。另请参阅下面的代码和截图。锚场将组件定位在第一行。 weightx字段为boardPanel的列提供更多空间。 ipady字段指定添加到组件高度的多少。在这里,boardPanel获得大部分宽度和所有高度。其他面板面板的高度为一半。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class GridExample { 
    private JFrame mainFrame; 
    private JPanel boardPanel, otherPanel; 

    public GridExample(){ 
     mainFrame = new JFrame(); 
     mainFrame.setSize(600,400); 
     mainFrame.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     mainFrame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEvent){ 
       System.exit(0); 
      }   
     });  

     boardPanel = new JPanel(); 
     boardPanel.add(new JLabel("board panel")); 
     boardPanel.setBackground(Color.yellow); 

     otherPanel = new JPanel(); 
     otherPanel.add(new JLabel("other panel")); 
     otherPanel.setBackground(Color.green); 

     c.anchor = GridBagConstraints.FIRST_LINE_START; 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.weightx = 0.75; 
     c.ipady = 400; 
     c.gridx = 0; 
     c.gridy = 0; 
     mainFrame.add(boardPanel, c); 

     c.anchor = GridBagConstraints.FIRST_LINE_START; 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.weightx = 0.25; 
     c.ipady = 200; 
     c.gridx = 1; 
     c.gridy = 0;  
     mainFrame.add(otherPanel, c); 
     mainFrame.setVisible(true); 
    } 

    public static void main(String[] args){ 
     GridExample swingContainerDemo = new GridExample(); 
    } 
} 

enter image description here