2012-09-26 17 views
5

大家好我有一个JFrame里面有三个组件。当用户 enter image description hereJava Swing:如何更改网格布局中一行的大小,并允许它仅动态调整大小,而不是垂直调整大小?

  1. 菜单
  2. 选项卡窗格
  3. 有一些按钮

最初我的目标是创建一个像下面这样的设计面板将调整应用程序的大小,一切都会调整大小。所以我想,也许,如果我用一个简单的网格布局我的问题就迎刃而解了,所以我决定做到以下几点:

  1. 选项卡式窗格将有一些面板内,这些小组将遵循网格布局。

  2. 底部的面板将遵循网格布局。

  3. JFrame也将遵循网格布局。

结果:

enter image description here

正如你可以看到这是不是我想要的东西,按钮是太大,尽管应用程序大小调整得非常好:

enter image description here

按钮也调整大小,但仍然太大。我希望能够为按钮(更具体地说是它们所包含的面板)设置一个小尺寸,并且当用户调整应用程序大小时,按钮将仅调整水平方向而不是垂直方向,这意味着只有选项卡式窗格会变大垂直。 这是可以实现的吗?我搜索并发现了关于gridbaglayout,我开始玩一点点,但我没有取得任何成就。所有我能够做到的是:

enter image description here

似乎不错,但是当我调整,这是我所得到的:

enter image description here

在此先感谢。

回答

10

我会使用BorderLayout作为内容窗格。使用BorderLayout.CENTER将其中的选项卡窗格和其中的按钮面板使用BorderLayout.SOUTH

+0

+1我觉得这也可以工作。然后为下面板设置'setPreferredSize'。这将使其高度不变。不要为中央面板设置大小。这样,一切都会保持一定的大小,而只有中心在展开窗口时展开。另外,下面的面板应该使用“FlowLayout”。 – davidXYZ

+1

@davidXYZ无需在下面板上设置首选尺寸。设置首选大小是例外! –

+0

@davidXYZ您可能希望先阅读[this](http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi)你开始弄乱pref/max/min尺寸 – MadProgrammer

7

JFrame也将遵循网格布局。

这是你的问题。相反,使用默认BorderLayout(所以删除您的呼叫设置JFrame的布局到网格布局)和

  1. 您的按钮面板与约束BorderLayout.SOUTH
  2. 添加添加选项卡式窗格中不受任何约束(这意味着约束BorderLayout.CENTER

看看的Swing LayoutManager tutorial尤其是涉及BorderLayout的例子。

小例子:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 

public class TestLayout { 

    protected void initUI() { 
     final JFrame frame = new JFrame(TestLayout.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     JMenuItem newItem = new JMenuItem("New..."); 
     JMenuItem open = new JMenuItem("Open..."); 
     fileMenu.add(newItem); 
     fileMenu.add(open); 
     menuBar.add(fileMenu); 
     JTabbedPane tabs = new JTabbedPane(); 
     tabs.addTab("Tab 1", new JPanel()); 
     tabs.addTab("Tab 2", new JPanel()); 
     tabs.addTab("Tab 3", new JPanel()); 
     JPanel buttonPanel = new JPanel(new GridLayout()); 
     buttonPanel.add(new JButton("Button-1")); 
     buttonPanel.add(new JButton("Button-2")); 
     buttonPanel.add(new JButton("Button-3")); 
     frame.add(tabs); 
     frame.add(buttonPanel, BorderLayout.SOUTH); 
     frame.setJMenuBar(menuBar); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestLayout().initUI(); 
      } 
     }); 
    } 
} 
相关问题