2014-07-21 75 views
4

我即将学习Java。我试图用一个GridBagLayout为一个简单的计算器编写一个GUI。GridBagLayout不接受我的rowspan命令(gridtheight)

问题是我的“+”按钮没有超过2行高。我不知道为什么?我试图用一次做最后一排:

c.gridwidth = 1; 
    c.gridy = 4; 
    c.gridx = 3; 
    c.gridheight = 2; 
    c.ipady = 26; 
    subpanel.add(bplus, c); 

和2最后一排一次英寸

c.gridwidth = 1; 
    c.gridy = 3; 
    c.gridx = 3; 
    c.gridheight = 2; 
    c.ipady = 26; 
    subpanel.add(bplus, c); 

这里是GUI的孔代码,如果你想测试它,也许你不得不调整为主。

package gui; 

import classes.Rechner; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

/** 
* Created by tq67 on 17.07.2014. 
*/ 
public class CalculatorGUI extends JFrame { 

public static void main(String[] args) { 

    CalculatorGUI gui = new CalculatorGUI(); 
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    gui.setVisible(true); 


} 

    public CalculatorGUI() { 
     setTitle("Calculator"); 
     setBounds(300, 300, 220, 225); 

     JPanel subpanel = new JPanel(); 
     JPanel headpanel = new JPanel(); 
     final JTextField input = new JTextField(); 

     input.addKeyListener(new KeyListener() { 
      @Override 
      public void keyTyped(KeyEvent e) { 

      } 

      @Override 
      public void keyPressed(KeyEvent e) { 

      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       if (10 == e.getKeyCode()) { 
        Rechner rechner = new Rechner(input.getText()); 
        input.setText(rechner.rechnen().toPlainString()); 
       } 
       if (27 == e.getKeyCode()) { 
        input.setText(""); 
       } 
      } 
     }); 
     ActionListener buttonListener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       input.setText(input.getText() + e.getActionCommand()); 
      } 
     }; 
     ActionListener resultListener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (e.getActionCommand().equals("=")) { 
        Rechner rechner = new Rechner(input.getText()); 
        input.setText(rechner.rechnen().toPlainString()); 
       } else { 
        input.setText(""); 
       } 

      } 

      private void calc() { 
       Rechner rechner = new Rechner(input.getText()); 
       input.setText(rechner.rechnen().toPlainString()); 
      } 
     }; 

     JButton b1 = new JButton("1"); 
     JButton b2 = new JButton("2"); 
     JButton b3 = new JButton("3"); 
     JButton b4 = new JButton("4"); 
     JButton b5 = new JButton("5"); 
     JButton b6 = new JButton("6"); 
     JButton b7 = new JButton("7"); 
     JButton b8 = new JButton("8"); 
     JButton b9 = new JButton("9"); 
     JButton b0 = new JButton("0"); 

     JButton bdot = new JButton("."); 
     JButton bplus = new JButton("+"); 
     JButton bminus = new JButton("-"); 
     JButton bdiv = new JButton("/"); 
     JButton bmult = new JButton("*"); 
     JButton bresult = new JButton("="); 

     JButton bcancel = new JButton("C"); 
     b1.addActionListener(buttonListener); 
     b2.addActionListener(buttonListener); 
     b3.addActionListener(buttonListener); 
     b4.addActionListener(buttonListener); 
     b5.addActionListener(buttonListener); 
     b6.addActionListener(buttonListener); 
     b7.addActionListener(buttonListener); 
     b8.addActionListener(buttonListener); 
     b9.addActionListener(buttonListener); 
     b0.addActionListener(buttonListener); 
     bdot.addActionListener(buttonListener); 
     bplus.addActionListener(buttonListener); 
     bminus.addActionListener(buttonListener); 
     bdiv.addActionListener(buttonListener); 
     bmult.addActionListener(buttonListener); 

     bresult.addActionListener(resultListener); 
     bcancel.addActionListener(resultListener); 

     headpanel.setLayout(new GridBagLayout()); 
     subpanel.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 




     c.fill = GridBagConstraints.HORIZONTAL; 
     c.weightx = 1; 
     c.weighty = 3; 
     c.gridx = 0; 
     c.gridy = 0; 
     c.ipady = 10; 
     headpanel.add(input, c); 

     setLayout(new BorderLayout()); 
     add(headpanel, BorderLayout.NORTH); 
     add(subpanel, BorderLayout.SOUTH); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 0; 
     c.gridx = 0; 
     c.gridy = 0; 
     subpanel.add(b7, c); 
     c.gridx++; 
     subpanel.add(b8, c); 
     c.gridx++; 
     subpanel.add(b9, c); 
     c.gridx++; 
     subpanel.add(bmult, c); 

     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 0; 
     c.gridy = 1; 
     subpanel.add(b4, c); 
     c.gridx++; 
     subpanel.add(b5, c); 
     c.gridx++; 
     subpanel.add(b6, c); 
     c.gridx++; 
     subpanel.add(bdiv, c); 


     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 0; 
     c.gridy = 2; 
     subpanel.add(b1, c); 
     c.gridx++; 
     subpanel.add(b2, c); 
     c.gridx++; 
     subpanel.add(b3, c); 
     c.gridx++; 
     subpanel.add(bminus, c); 


     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridheight = 1; 
     c.ipady = 0; 
     c.gridx = 0; 
     c.gridy = 3; 
     subpanel.add(bdot, c); 
     c.gridwidth = 2; 
     c.gridx++; 
     subpanel.add(b0, c); 
     c.gridwidth = 1; 
     c.gridx = 3; 
     c.gridheight = 2; 
     c.ipady = 26; 
     subpanel.add(bplus, c); 


     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridwidth = 1; 
     c.ipady = 0; 
     c.gridx = 0; 
     c.gridy = 4; 
     subpanel.add(bcancel, c); 
     c.gridx = 1; 
     c.gridwidth = 2; 
     subpanel.add(bresult, c); 

    } 
} 

我读到这里的#1,当你乌斯的gridx是更大然后0你将有gridheight问题的错误...

此刻的GUI看起来像这样:

calc.png

Thx for your help。

回答

4

两件事情,第一,重置gridheight你用过之后

c.gridwidth = 1; 
c.gridx = 3; 
c.gridheight = 2; 
c.ipady = 26; 
subpanel.add(bplus, c); 

c.fill = GridBagConstraints.HORIZONTAL; 
c.gridwidth = 1; 
c.ipady = 0; 
c.gridx = 0; 
c.gridy = 4; 
// Still using the gridheight of 2... 
subpanel.add(bcancel, c); 

应该更像......

c.fill = GridBagConstraints.HORIZONTAL; 
c.gridwidth = 1; 
c.ipady = 0; 
c.gridx = 0; 
c.gridy = 4; 
c.gridheight = 1; 
subpanel.add(bcancel, c); 

我也想摆脱c.ipady = 26;,但这就是我;)

第二,利用BOTH填充约束...

c.fill = GridBagConstraints.BOTH; 
c.gridwidth = 1; 
c.gridx = 3; 
c.gridheight = 2; 
c.ipady = 26; 
subpanel.add(bplus, c); 

Calculator

也...

public void keyReleased(KeyEvent e) { 
    if (10 == e.getKeyCode()) { 
     Rechner rechner = new Rechner(input.getText()); 
     input.setText(rechner.rechnen().toPlainString()); 
    } 
    if (27 == e.getKeyCode()) { 
     input.setText(""); 
    } 
} 

keyCode并不代表ASCII字符,而是代表了虚拟键码。你应该使用KeyEvent.VK_ENTER(我认为)和KeyEvent.VK_ESCAPE。请注意,一个JTextField已经有能力处理输入ActionListener接口。在任何情况下,你应该考虑使用Key Bindings API如果可能的话

+0

THX很多!我的TF不会接受输入代码:(如果我不实现像这样......但我会尝试用KeyEvent的...您的解决方案,是KeyEvent的 – Synoon

+1

它将解决方案的优势,你需要添加['ActionListener'到外地(http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html)(和[如何使用文本字段(http://docs.oracle .COM/JavaSE的/教程/ uiswing /组件/ textfield.html)。使用'KeyEvent.VK_ *'方法的优点是它是如何想使用,实际的硬件按键行程是由Java的转换为虚拟键表示 – MadProgrammer

+0

我也摆脱了c.ipady表达是非常不现实..的存在有一个简单的方法来做到这一点没有? – Synoon