2016-03-02 91 views
1

我需要设计一个摆动GUI,它有一个JFrame,顶部有一个菜单,另一个主面板有三个中央面板和一个面板底部的独立面板。 UI的需要设计如下enter image description here 但是当我跑我的挥杆应用程序,我得到这样的输出(所有的面板都装在窗口的中心)如何使用Swing中的控件填充GridbagLayout的单元格?

enter image description here

下面是我的代码

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

public class FrontEndView { 
    private JFrame mainFrame; 
    private JPanel mainPanel,subPanelUp,subPanelDown,panelLeft,panelRight,panelCenter,panelDown; 
    private JScrollPane scrollPane; 
    private JList logViewList; 
    private JPanel panel1; 

    public FrontEndView(){ 
     this.prepareGUI(); 
    } 

    public void prepareGUI(){ 
     mainFrame=new JFrame("GUI"); 
     Toolkit tk = Toolkit.getDefaultToolkit(); 
     int xSize = ((int) tk.getScreenSize().getWidth()); 
     int ySize = ((int) tk.getScreenSize().getHeight()); 
     mainFrame.setSize(xSize,ySize); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setResizable(true); 
     mainFrame.setLayout(new BorderLayout()); 

     mainPanel=new JPanel(); 
     mainPanel.setLayout(new GridBagLayout()); 
     mainPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 

     GridBagConstraints gridbagConstMain = new GridBagConstraints(); 
     GridBagConstraints gridbagConstSub = new GridBagConstraints(); 

     subPanelUp=new JPanel(); 
     subPanelUp.setLayout(new GridBagLayout()); 
     subPanelUp.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 

     panelLeft=new JPanel(); 
     panelLeft.setBorder(BorderFactory.createTitledBorder("Message Defs")); 
     gridbagConstSub.fill = GridBagConstraints.HORIZONTAL; 
     gridbagConstSub.weightx = 0.5; 
     gridbagConstSub.gridx = 0; 
     gridbagConstSub.gridy = 0; 
     subPanelUp.add(panelLeft, gridbagConstSub); 

     panelCenter=new JPanel(); 
     panelCenter.setBorder(BorderFactory.createTitledBorder("Main Workspace")); 
     gridbagConstSub.fill = GridBagConstraints.HORIZONTAL; 
     gridbagConstSub.weightx = 0.5; 
     gridbagConstSub.gridx = 1; 
     gridbagConstSub.gridy = 0; 
     subPanelUp.add(panelCenter, gridbagConstSub); 

     panelRight=new JPanel(); 
     panelRight.setBorder(BorderFactory.createTitledBorder("Script Viewer")); 
     gridbagConstSub.fill = GridBagConstraints.HORIZONTAL; 
     gridbagConstSub.weightx = 0.5; 
     gridbagConstSub.gridx = 2; 
     gridbagConstSub.gridy = 0; 
     subPanelUp.add(panelRight, gridbagConstSub); 

     mainPanel.add(subPanelUp,gridbagConstMain); 

     subPanelDown=new JPanel(); 
     subPanelDown.setLayout(new BorderLayout()); 
     panelDown=new JPanel(); 
     panelDown.setBorder(BorderFactory.createTitledBorder("Log View")); 
     logViewList= new JList(); 
     panelDown.add(logViewList); 
     gridbagConstSub.fill = GridBagConstraints.HORIZONTAL; 
     //gridbagConst.ipady=20; 
     //gridbagConst.weightx = 0.0; 
     gridbagConstSub.gridwidth = 5; 
     gridbagConstSub.gridx = 0; 
     gridbagConstSub.gridy = 0; 
     subPanelDown.add(panelDown,BorderLayout.PAGE_END); 
     mainPanel.add(subPanelDown, gridbagConstSub); 

     scrollPane=new JScrollPane(mainPanel,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

     mainFrame.add(scrollPane); 
     mainFrame.setVisible(true); 
    } 

    public static void main(String[] args){ 
     FrontEndView frontEnd = new FrontEndView(); 
    } 
} 

我要填补的GridBagLayout的细胞与相关面板/控制其持有如图所示的设计同时,各组应当有内部填充它的控件(我需要补充,其大小应与panelDown内一个JList是panelDown JPanel的大小)。简单地说我不喜欢在我的JFrame中不需要任何额外的空间。请指导我在我的代码中缺少的内容。

回答

2

我建议你可以使用不同的布局管理器嵌套面板来解决问题。

一个框架的默认布局是一个BorderLayout。

因此,您可以创建一个面板并将其添加到PAGE_END,以便在底部显示整个宽度。

然后,您可以创建另一个使用GridLayout的面板。然后,您可以将3个子面板添加到此面板,并且每个面板都可以使用其自己的布局。然后,将此面板添加到框架的中心。随着框架尺寸的变化,额外的空间将被分配给CENTER,使面板动态增长。

编辑:

太多的面板为我花时间去理解发生了什么

我建议这样的结构:

frame (which by default uses a BorderLayout) 
--- CENTER 
    panel using GrigBagLayout 
     childPanel1 
     childPanel2 
     childPanel3 
---- PAGE_END 
    JScrollPane containing the JList 

当您创建JList的基本代码将是:

JList list = new JList(...); 
list.setVisibleRowCount(5); 
JScrollPane scrollPane = new JScrollPane(list); 

有没有必要创建面板的理由t将列表添加到另一个面板。设置可见行数的要点是给JList一个固定的高度。滚动条会根据需要出现在滚动窗格中。

既然PAGE_END有一个固定的高度分量,那么空间的所有重置将转到您添加到框架中心的组件。

所有的面板都装在

的面板在他们的首选尺寸显示当您使用GridBagLayout的窗口的中心)。如果所有面板的总大小小于scrollpane的大小,那么它们将位于中心。如果您希望面板填充可用空间,那么我相信您需要使用weightx/y约束。请阅读描述所有约束的Swing教程How to Use GridBagLayout中的部分。

这就是为什么我建议使用GridLayout。它将使所有面板具有相同的大小,并且将填充滚动窗格的视口而不用约束。

mainFrame.add(menubar,BorderLayout.NORTH); 

这不是你如何在框架中添加菜单条。

您应该使用:

mainFrame.setJMenuBar(menuBar); 

你在你的最后一个问题告诉本报。你为什么不听劝告?为什么当你不注意建议的时候,我们应该花点时间帮忙。

+0

@Sherihan我无法阅读评论中的代码。发布一个合适的[SSCCE](http://sscce.org/)(在你的原始问题中)来证明问题。 – camickr

+0

我没有编辑上面的代码,只检查panelDown是否按要求对齐,但仍然有相同的问题。你检查出来吗? – sher17

+0

@Sherihan'你可以检查一下吗?' - 不,因为你没有发布'SSCCE'。我无法编译该代码。与菜单相关的代码不相关,因此不应将其包含在SSCCE中。 SSCCE应尽可能小。 – camickr

0

根据您的指示,我改变了我的设计方式,所有外部面板都使用边界布局,最内部的更多控件与Grid,GridBag和FlowLayouts一起使用。这样整个设计就可以做得很好。

另外,如果需要展开某个布局单元格中的特定面板,则需要时使用setPreferredSize(new Dimension(int,int))。

相关问题