2011-03-06 37 views
1

this question有些相關。垂直JSeparator通過GridBagLayout錯誤定位

我試圖創建一個窗口,兩個面板的寬度比例爲2:1(左側面板比右側面板寬),我使用GridBagLayout。

基本上,一些看起來是這樣的:

 
____________________ 
|   |  | 
| leftPanel |right- | 
|   |Panel | 
|   |->|  | 
|_________|__|_______| 
      | 
      | 
    both panels separated 
    by a vertical separator 


下面是創建頂級JPanel代碼(我把它叫做totalGui)同時持有leftPanelrightPanel

private JPanel createContentPane(){ //creates a top-level JPanel 
            //that is returned to the JFrame's 
            //setContentPane() method 
    int WINHEIGHT = 600; 
    int WINWIDTH = 800; 
    JPanel totalGui = new JPanel(); //this is the JPanel that will be returned 
    totalGui.setBackground(Color.white); 
    totalGui.setMinimumSize(new Dimension(WINWIDTH,WINHEIGHT)); 
    totalGui.setPreferredSize(new Dimension(WINWIDTH,WINHEIGHT)); 
    totalGui.setMaximumSize(new Dimension(WINWIDTH,WINHEIGHT)); 
    totalGui.setLayout(new GridBagLayout()); 
    totalGui.setOpaque(true); 
    GridBagConstraints c = new GridBagConstraints(); 

    /* totalGui (the top-level JPane) has two JPanes called 
     leftPanel and rightPanel. The widths of leftPanel and rightPanel 
     are in the ratio 2:1. So, leftPanel takes up 2/3rd of the totalGui's 
     width, and rightPanel gets the remaining 1/3rd */ 

    /* Top-level left panel */ 
    JPanel leftPanel = new JPanel(); 
    int LEFTPANELWIDTH = WINWIDTH*2/3; 
    leftPanel.setMinimumSize(new Dimension(LEFTPANELWIDTH,WINHEIGHT)); 
    leftPanel.setPreferredSize(new Dimension(LEFTPANELWIDTH,WINHEIGHT)); 
    leftPanel.setMaximumSize(new Dimension(LEFTPANELWIDTH,WINHEIGHT)); 
    c.gridx = 0; 
    c.gridy = 0; 
    c.gridheight=4; //both leftPanel and rightPanel are 4 cells high 
    c.gridwidth=2; //leftPanel is 2 cells wide, rightPanel is 1 cell wide (code below) 
    c.fill = GridBagConstraints.VERTICAL; 
    totalGui.add(leftPanel, c); 

    /* Vertical separator between leftPanel and rightPanel */ 
    c.gridx = 2; //'2' because leftPanel is 2 cells wide and the separator's leading 
       //edge must lie in the third cell (gridx = 2) if it is to be 
       //sandwiched between leftPanel and rightPanel 
    c.gridy = 0; 
    c.gridwidth=0; //I've also tried gridwidth=1, but it doesn't solve the problem 
    c.fill = GridBagConstraints.NONE; 
    c.anchor=GridBagConstraints.CENTER; 
    JSeparator verticalsep = new JSeparator(SwingConstants.VERTICAL); 
    verticalsep.setPreferredSize(new Dimension(6,WINHEIGHT-10)); //the 'WINHEIGHT-10' bit is purely cosmetic 
                   //I just wanted some space between the 
                   //separator edges and the window border 
                   //(also why the anchor is set to CENTER) 
    totalGui.add(verticalsep,c); //PROBLEM: verticalsep is not displayed where I expected it to be; 
           //please see attached image in post 

    /* Top-level right panel */ 
    JPanel rightPanel = new JPanel(); 
    int RIGHTPANELWIDTH = WINWIDTH*1/3; 
    rightPanel.setBackground(Color.blue); 
    rightPanel.setMinimumSize(new Dimension(RIGHTPANELWIDTH,WINHEIGHT)); 
    rightPanel.setPreferredSize(new Dimension(RIGHTPANELWIDTH,WINHEIGHT)); 
    rightPanel.setMaximumSize(new Dimension(RIGHTPANELWIDTH,WINHEIGHT)); 
    c.gridx = 2; 
    c.gridy = 0; 
    c.gridwidth=1; //rightPanel is 1 cell wide, leftPanel is 2 cells wide (code above) 
    c.gridheight=4; //both leftPanel and rightPanel are 4 cells high 
    c.fill = GridBagConstraints.VERTICAL; 
    totalGui.add(rightPanel, c); 

    return totalGui; 
} 


我的問題是分隔符未顯示在正確的位置。這是我得到的:link to image(抱歉,我沒有足夠的聲望發佈圖像)。


誰能告訴我我做錯了什麼嗎?

非常感謝您的幫助。

回答

1

您應該使用GridBagConstraints.HORIZONTAL而不是GridBagConstraints.VERTICAL。試試這個,你會得到以下結果(分隔符爲紅色): enter image description here

package com.denisk.fun.swing; 

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

/** 
* Date: Mar 6, 2011 
* Time: 9:11:03 AM 
* 
* @author denisk 
*/ 
public class GridBagLayoutTest extends JFrame { 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("GridBagLayoutDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Set up the content pane. 
     frame.setContentPane(createContentPane()); 
     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static Container createContentPane() { 
     int WINHEIGHT = 600; 
     int WINWIDTH = 800; 
     JPanel totalGui = new JPanel(); //this is the JPanel that will be returned 
     totalGui.setBackground(Color.white); 
     totalGui.setMinimumSize(new Dimension(WINWIDTH, WINHEIGHT)); 
     totalGui.setPreferredSize(new Dimension(WINWIDTH, WINHEIGHT)); 
     totalGui.setMaximumSize(new Dimension(WINWIDTH, WINHEIGHT)); 
     totalGui.setLayout(new GridBagLayout()); 
     totalGui.setOpaque(true); 
     GridBagConstraints c = new GridBagConstraints(); 

     /* totalGui (the top-level JPane) has two JPanes called 
       leftPanel and rightPanel. The widths of leftPanel and rightPanel 
       are in the ratio 2:1. So, leftPanel takes up 2/3rd of the totalGui's 
       width, and rightPanel gets the remaining 1/3rd */ 

     /* Top-level left panel */ 
     JPanel leftPanel = new JPanel(); 
     int LEFTPANELWIDTH = WINWIDTH * 2/3; 
     leftPanel.setMinimumSize(new Dimension(LEFTPANELWIDTH, WINHEIGHT)); 
     leftPanel.setPreferredSize(new Dimension(LEFTPANELWIDTH, WINHEIGHT)); 
     leftPanel.setMaximumSize(new Dimension(LEFTPANELWIDTH, WINHEIGHT)); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.gridheight = 4; //both leftPanel and rightPanel are 4 cells high 
     c.gridwidth = 2; //leftPanel is 2 cells wide, rightPanel is 1 cell wide (code below) 
     c.fill = GridBagConstraints.HORIZONTAL; 
     totalGui.add(leftPanel, c); 

     /* Vertical separator between leftPanel and rightPanel */ 
     c.gridx = 2; //'2' because leftPanel is 2 cells wide and the separator's leading 
     //edge must lie in the third cell (gridx = 2) if it is to be 
     //sandwiched between leftPanel and rightPanel 
     c.gridy = 0; 
     c.gridwidth = 0; //I've also tried gridwidth=1, but it doesn't solve the problem 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.anchor = GridBagConstraints.CENTER; 
     JSeparator verticalsep = new JSeparator(SwingConstants.VERTICAL); 
     verticalsep.setBackground(new Color(255, 0, 102)); 
     verticalsep.setPreferredSize(new Dimension(6, WINHEIGHT - 10)); //the 'WINHEIGHT-10' bit is purely cosmetic 
     //I just wanted some space between the 
     //separator edges and the window border 
     //(also why the anchor is set to CENTER) 
     totalGui.add(verticalsep, c); //PROBLEM: verticalsep is not displayed where I expected it to be; 
     //please see attached image in post 

     /* Top-level right panel */ 
     JPanel rightPanel = new JPanel(); 
     int RIGHTPANELWIDTH = WINWIDTH * 1/3; 
     rightPanel.setBackground(Color.blue); 
     rightPanel.setMinimumSize(new Dimension(RIGHTPANELWIDTH, WINHEIGHT)); 
     rightPanel.setPreferredSize(new Dimension(RIGHTPANELWIDTH, WINHEIGHT)); 
     rightPanel.setMaximumSize(new Dimension(RIGHTPANELWIDTH, WINHEIGHT)); 
     c.gridx = 2; 
     c.gridy = 0; 
     c.gridwidth = 1; //rightPanel is 1 cell wide, leftPanel is 2 cells wide (code above) 
     c.gridheight = 4; //both leftPanel and rightPanel are 4 cells high 
     c.fill = GridBagConstraints.HORIZONTAL; 
     totalGui.add(rightPanel, c); 

     return totalGui; 
    } 
} 
+0

我明白了,因爲我的板(以及分隔符)是一樣高的窗口/父'JPanel' (實際上什麼都不留給_constrain_),約束沿着另一個軸進入。這就說得通了。我已經接受你的回答,非常感謝。 – 2011-03-06 10:10:18