2011-05-02 82 views
0

因此,我在添加两个JPanel到主主面板时遇到了一个小问题。我已经把它作为我想做的一个快速例子,因为你不想查看大量不必要的代码行:)。我想先添加面板1(北部),然后面板2(南部)。我试过使用边界布局和定位他们调用南北BorderLayout添加面板时,但仍然没有运气。JPanel布局问题

在此先感谢。

private JPanel one,two; 

public Example(){ 
    one = new JPanel(); 
    one.setSize(new Dimension(400,400)); 
    two = new JPanel(new GridLayout(7,8)); 
    two.setSize(new Dimension(400,400)); 
    one.setBackground(Color.BLACK); 
    two.setBackground(Color.BLUE); 
    JPanel mainpanel = new JPanel(); 
    mainpanel.setBackground(Color.orange); 
    mainpanel.add(one); 
    mainpanel.add(two); 
    add(mainpanel); 
    setSize(500,500); 
    setVisible(true); 
} 
+0

“你不想看到大量不必要的代码行”不,我不知道,但[SSCCE](http://pscode.org/sscce.html)可能会有所帮助。顺便说一句 - 你期望什么行为?目前的行为与预期不符?你有*问题*,还是只是与我们分享这段代码片段? – 2011-05-02 20:42:05

+4

顺便说一句 - 从2 x 400x400面板何时装入500x500容器?在这种情况下,幸运的是布局大多忽略了'setSize()',并且会根据需要否决其他值的首选大小。很少有必要在Java GUI中设置组件的大小或首选大小。 – 2011-05-02 20:53:05

回答

1

如果你想使用BorderLayout的,然后BorderLayout.CENTER占据尽可能多的空间是可以的,他们只需要其他的什么方向走。如果您将额外的东西添加到JPanel中,它们将根据它们包含的对象的需要变大。

如果你只想整除内主要的JPanel的空间,试试这个:

JPanel mainpanel = new JPanel(new GridLayout(2, 1)); 

会创建一个与2行1列一个网格布局...

+0

谢谢,我试过了,但它没有工作,但我发现我宣布框架布局的地方是搞砸了。感谢您的回复:) – unleashed 2011-05-02 20:47:34

1

试试这个代码。显然,如果在面板上安装网格布局,并且不添加任何组件,则不会占用空间。

import java.awt.BorderLayout; 
import java.awt.Color; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Example extends JFrame 
{ 
    private JPanel one, two; 

    public Example() 
    { 
     one = new JPanel(); 
     two = new JPanel();///new GridLayout(7, 8)); 
     one.setBackground(Color.BLACK); 
     two.setBackground(Color.BLUE); 
     JPanel mainpanel = new JPanel(new BorderLayout()); 
     mainpanel.setBackground(Color.orange); 
     mainpanel.add(one, BorderLayout.NORTH); 
     mainpanel.add(two, BorderLayout.SOUTH); 
     setContentPane(mainpanel); 
     setSize(500, 500); 
     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       Example f = new Example(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+0

好[sscce](http://sscce.org),但空'GridLayout'不是问题。在'one'和'two'上设置首选大小,给'mainpanel'一个'GridLayout',并使用'pack()'(而不是'setSize()')来查看效果。 – trashgod 2011-05-03 02:19:17

+0

不需要调用'setContentPane();'因为这是宣布的'LayoutManager'的工作,并包装最小。 'setVisible()'变成'InvokeLater'(EDT),正确的将是整个'主'方法 – mKorbel 2011-05-03 06:33:58

+0

@trashgod设置(仍然)空面板上的prefSize是作弊:-) – kleopatra 2011-05-03 07:26:23

0

GridLayout忽略在包含组件的setSize方法中设置的值。如果您想控制每个组件的大小,请考虑使用GridBagLayout