【问题标题】:How to fill Cells of GridbagLayout with the controls in Swing?如何用 Swing 中的控件填充 GridbagLayout 的单元格?
【发布时间】:2016-03-02 19:51:44
【问题描述】:

我需要设计一个摇摆 GUI,它有一个 JFrame,顶部有一个菜单,另一个主面板在中间有三个面板,在面板底部有一个单独的面板。 UI的要求设计如下 但是当我运行我的摇摆应用程序时,我会得到这样的输出(所有面板都打包在窗口的中心)

下面是我的代码

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 中可见任何额外的空间。请指导我了解我的代码中缺少的内容。

【问题讨论】:

    标签: java swing jpanel layout-manager gridbaglayout


    【解决方案1】:

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

    框架的默认布局是 BorderLayout。

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

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

    编辑:

    面板太多,我无法花时间了解正在发生的事情

    我建议的是这样的结构:

    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 );
    

    没有必要仅仅为了将列表添加到另一个面板而创建面板。设置可见行数的目的是给 JList 一个固定的高度。然后,滚动条将根据需要出现在滚动窗格中。

    现在 PAGE_END 有一个固定高度的组件,所有空间的重置都将转到您添加到框架中心的组件。

    所有的面板都装在窗口的中心)

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

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

    mainFrame.add(menubar,BorderLayout.NORTH);
    

    这不是向框架添加菜单栏的方式。

    你应该使用:

    mainFrame.setJMenuBar(menuBar);
    

    您在上一个问题中被告知。为什么不听劝告???当您不注意建议时,我们为什么要花时间提供帮助。

    【讨论】:

    • @Sherihan 我无法阅读评论中的代码。发布一个正确的SSCCE(在您的原始问题中)来证明问题。
    • 我确实编辑了上面的代码,只检查 panelDown 是否按要求对齐但仍然有同样的问题。你能检查一下吗?
    • @Sherihan can you check it out? - 不,因为您还没有发布SSCCE。我无法编译该代码。并且与菜单相关的代码不相关,因此不应包含在 SSCCE 中。 SSCCE 应该尽可能小。
    • 我已经发布了 SSCCE。你能看看吗?
    • @Sherihan,这不是 SSCCE!!!我特别指出与菜单相关的代码不相关。我们不想花时间阅读不必要的代码来了解您在做什么。我们希望您花时间隔离与问题直接相关的代码。有关更多建议,请参阅编辑。
    【解决方案2】:

    根据您的指示,我更改了我的设计,使所有外部面板都与边框布局一起使用,而具有更多控件的最里面的面板则根据要求与 Grid、GridBag 和 FlowLayouts 一起使用。这样整个设计就可以做得很好了。

    此外,如果需要扩展布局单元格中的特定面板,我会在需要时使用 setPreferredSize(new Dimension(int,int))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 2015-06-04
      • 1970-01-01
      • 2018-08-31
      • 2015-05-22
      • 2018-07-08
      • 2019-08-29
      • 2018-11-04
      相关资源
      最近更新 更多