2011-04-09 110 views
29

我似乎无法让我的Java Swing组件正确地一起工作。如何让Java Swing组件填充可用空间?

我想要做的是有一个JPanel填充JTabbedPane中可用的所有空间。此刻,我的设置如下:

public class Gui extends JFrame { 
    private final EventBus eventBus = EventBus.getInstance(); 
    private final ToolkitUtil toolkitUtil; 
    private final Menu menu; 
    private final InfoBar infoBar; 
    private final JTabbedPane pane; 

    ... 

    private void buildLayout() { 
     GridBagConstraints gbc = new GridBagConstraints(); 

     setJMenuBar(menu); 

     add(pane, BorderLayout.CENTER); 
     add(infoBar, BorderLayout.SOUTH); 

     pane.addTab("Plugins", new PluginPanel()); 
    } 
} 

public class PluginPanel extends JPanel { 
    private final JPanel modelPanel; 
    private final JPanel editorPanel; 

    public PluginPanel() { 
     setLayout(new GridBagLayout()); 

     modelPanel = new JPanel(new GridBagLayout()); 
     editorPanel = new JPanel(new GridBagLayout()); 

     buildLayout(); 
    } 

    private void buildLayout() { 
     GridBagConstraints gbc = new GridBagConstraints(); 

     modelPanel.setBorder(BorderFactory.createTitledBorder("Models")); 
     editorPanel.setBorder(BorderFactory.createTitledBorder("Editors")); 

     gbc.gridx = 0; 
     gbc.fill = GridBagConstraints.BOTH; 

     modelPanel.add(new JLabel("test label"), gbc); 
     add(modelPanel, gbc); 

     gbc.gridx = 1; 
     add(editorPanel, gbc); 
    } 
} 

这就产生了一个窗口那是我所希望的大小(动态正比于屏幕大小,不包括在上面的代码)。放置在中间的标签面板被扩展以填充所需的所有空间,这正是我想要的。但是,我在标签面板中添加的面板只与其内容一样大。如果我添加标签或任何东西,它只会增长到与组件一样大。我希望它们始终能够扩展以填充标签面板。

回答

32

尝试的GridBagConstraints的权重设置为非零值:

gbc.weightx = gbc.weighty = 1.0; 
+1

什么传奇!谢谢! – 2011-04-09 09:52:56

+0

这就像一个GridBagLayout的新**谱**!非常感谢! +1! – desperateCoder 2013-05-17 16:24:10

51

最简单的方法是使用BorderLayout和将组件置于中心位置。

+4

适用于我... GridBag太复杂了...非常感谢.. – Sreekar 2013-07-09 06:53:45

+1

更简单,并且完全有效。 – kwiqsilver 2016-02-09 02:13:26

+1

令人惊叹。对我的包装JPanel和瞧,一些小的改变!谢谢! – 2016-11-29 04:51:25

0

将您的容器的MinimumSize设置为您想要的优先大小,然后使用面板设置容器的ContentPane。

setMinimumSize(new Dimension(width,height)); 
    setContentPane(new MyPanel()); 

此代码适用于所有的布局。

或直接致电您的容器:

setContentPane(new MyPanel()); 

此代码为BorderLayout的或免费设计