2017-04-04 95 views
0

我有一个关于GridBagLayout的问题。我试图制作一个简单的计算器,并且我使用GridBagLayout将所有按钮放在按钮面板中,尽管它将所有按钮都放在中间,而不会改变按钮的大小,这是合乎逻辑的。我可以在GridLayout(它调整按钮的大小和JPanel的大小)和GridBagLayout(所以我可以把它们放在宽度和顺序我想要)之间获得一些东西吗?将GridBagLayout调整为JPanel大小

与布局的代码如下:

... BottomPanel(){

this.setLayout(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 

    backspace = new JButton("<--"); 
    clean = new JButton("C"); 
    plusminus = new JButton("+/-"); 
    squareroot = new JButton("\u221A"); 
    divide = new JButton("/"); 
    percent = new JButton("%"); 
    multiply = new JButton("*"); 
    fraction = new JButton("1/x"); 
    minus = new JButton("-"); 
    plus = new JButton("+"); 
    dot = new JButton("."); 
    equals = new JButton("="); 
    zero = new JButton("0"); 
    one = new JButton("1"); 
    two = new JButton("2"); 
    three = new JButton("3"); 
    four = new JButton("4"); 
    five = new JButton("5"); 
    six = new JButton("6"); 
    seven = new JButton("7"); 
    eight = new JButton("8"); 
    nine = new JButton("9"); 


    gbc.gridx = 0; 
    gbc.gridy = 0; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(backspace, gbc); 

    gbc.gridx = 1; 
    gbc.gridy = 0; 
    gbc.gridwidth = 2; 
    gbc.gridheight = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    this.add(clean, gbc); 

    gbc.gridx = 3; 
    gbc.gridy = 0; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(plusminus, gbc); 

    gbc.gridx = 4; 
    gbc.gridy = 0; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(squareroot, gbc); 

    gbc.gridx = 0; 
    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(seven, gbc); 

    gbc.gridx = 1; 
    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(eight, gbc);  

    gbc.gridx = 2; 
    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(nine, gbc); 

    gbc.gridx = 3; 
    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(divide, gbc); 

    gbc.gridx = 4; 
    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(percent, gbc); 

    gbc.gridx = 0; 
    gbc.gridy = 2; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(four, gbc); 

    gbc.gridx = 1; 
    gbc.gridy = 2; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(five, gbc); 

    gbc.gridx = 2; 
    gbc.gridy = 2; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(six, gbc); 

    gbc.gridx = 3; 
    gbc.gridy = 2; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(multiply, gbc); 

    gbc.gridx = 4; 
    gbc.gridy = 2; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(fraction, gbc); 

    gbc.gridx = 0; 
    gbc.gridy = 3; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(one, gbc); 

    gbc.gridx = 1; 
    gbc.gridy = 3; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(two, gbc); 

    gbc.gridx = 2; 
    gbc.gridy = 3; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(three, gbc); 

    gbc.gridx = 3; 
    gbc.gridy = 3; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(minus, gbc); 

    gbc.gridx = 4; 
    gbc.gridy = 3; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 2; 
    gbc.fill = GridBagConstraints.VERTICAL; 
    this.add(equals, gbc); 

    gbc.gridx = 0; 
    gbc.gridy = 4; 
    gbc.gridwidth = 2; 
    gbc.gridheight = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    this.add(zero, gbc); 

    gbc.gridx = 2; 
    gbc.gridy = 4; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(dot, gbc); 

    gbc.gridx = 3; 
    gbc.gridy = 4; 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    this.add(plus, gbc); 




} 

,其结果是:

Calculator

谢谢!

+0

也许jgoodies formlayout适合您的需求 – XtremeBaumer

+0

将非零权重分配给您的网格袋约束有帮助吗? –

回答

0

这里至少在正确的方向迈出的一步:在你创建GridBagConstraints对象后,设置其权重严格大于0:

gbc.weightx = 0.1; 
    gbc.weighty = 0.1; 

这并不重要,其价值你挑,只要大于0.0,不大于1.0。这会导致你的按钮大部分在水平方向伸展填写可用空间和甚至垂直间距流传:

Small panel

Panel dragged large

你可能已经知道,如果你想要的按钮时长面板确实如此,你可以使用gbc.fill = GridBagConstraints.BOTH;

+0

非常感谢!有谁知道如何“强制”按钮同时垂直拉伸? 非常感谢! – Dominika

+0

'gbc.fill = GridBagConstraints.BOTH;'或'gbc.fill = GridBagConstraints.VERTICAL;'。 @Dominika –

+0

非常感谢!它现在完美运行!你非常有帮助!谢谢! – Dominika