2017-09-09 87 views
0

我正在尝试创建一个简单的小费计算器程序,但是,对于一般的操作侦听器,我有点新,所以我不确定自己做错了什么。 我希望按钮更新num的值,将其格式化为一个字符串,然后更改标签的文本(显示用户输入的内容(这是账单金额))。如何将两个动作添加到JButton?提示计算器程序

这里是我的代码:

package calculatorCW; 

import java.awt.Color; 
import java.awt.event.*; 
import java.text.DecimalFormat; 
import java.text.ParseException; 
import javax.swing.*; 

public class calGui { 
    double tip = 0; 
    String num = "000.00", output1 = "00.00", output2 = "00.00"; 
    JFrame frame = new JFrame(); 
    JPanel myPanel = new JPanel(); 
    JLabel label1, label2, label3, label4; 
    JTextField myText1, myText2; 
    JButton buttons, tBtn1, tBtn2, tBtn3, calc, btn0; 
    DecimalFormat formatter = new DecimalFormat(); 
    private int i = 1; 

    public calGui() { 
     initializeLabels(); 
     initializeTextFields(); 
     initializeButtons(); 
     setPanels(); 
     setBounds(); 
     guiExtras(); 
     setActionListeners(); 
    } 

    public static void main(String[] args) { 
     new calGui(); 
    } 

    public void initializeLabels() { 

     label1 = new JLabel("<html> <p style='font-size: 15px; color: red;'> TIP CALCULATOR </p></html>"); 
     label2 = new JLabel("<html> <p style='color: white;'> Bill Amount:</p></html> "); 
     label3 = new JLabel("<html> <p style='color: white;'>Tip Percentage: </p></html>"); 
     label4 = new JLabel("<html> <p style='color: white;'>Total Cost: </p></html>"); 
    } 

    public void initializeTextFields() { 
     myText1 = new JTextField(output1); 
     myText2 = new JTextField(output2); 
    } 

    public void initializeButtons() { 
     tBtn1 = new JButton("<html> <p style='color: blue;'>15 %</p></html>"); 
     tBtn2 = new JButton("<html> <p style='color: blue;'>18 %</p></html>"); 
     tBtn3 = new JButton("<html> <p style='color: blue;'>20 %</p></html>"); 
     calc = new JButton("<html> <p style='color: black;'>CALC</p></html>"); 
     btn0 = new JButton("0"); 
     //Buttons Loop 
     for (int col = 50; col <= 190; col = col + 70) { 
      for (int row = 253; row <= 393; row = row + 70) { 
       buttons = new JButton("" + i); 
       myPanel.add(buttons); 
       buttons.setBounds(row, col, 60, 50); 
       buttons.setActionCommand(String.valueOf(i)); 
       i++; 
      } 
     } 
    } 

    public void setPanels() { 
     myPanel.add(tBtn1); 
     myPanel.add(tBtn2); 
     myPanel.add(tBtn3); 
     myPanel.add(calc); 
     myPanel.add(btn0); 
     myPanel.add(label1); 
     myPanel.add(label2); 
     myPanel.add(label3); 
     myPanel.add(label4); 
     myPanel.add(myText1); 
     myPanel.add(myText2); 
    } 

    public void setBounds() { 
     tBtn1.setBounds(23, 90, 60, 50); 
     tBtn2.setBounds(93, 90, 60, 50); 
     tBtn3.setBounds(163, 90, 60, 50); 
     calc.setBounds(13, 190, 100, 50); 
     btn0.setBounds(323, 260, 60, 50); 
     label1.setBounds(155, -5, 200, 50); 
     label2.setBounds(13, 50, 100, 20); 
     label3.setBounds(13, 70, 200, 20); 
     label4.setBounds(13, 160, 100, 20); 
     myText1.setBounds(96, 50, 100, 20); 
     myText2.setBounds(96, 160, 100, 20); 
    } 

    public void guiExtras() { 
     myPanel.setLayout(null); 
     myPanel.setSize(500, 400); 
     frame.add(myPanel); 
     frame.setBounds(600, 50, 500, 400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myText1.setEditable(false); 
     myText2.setEditable(false); 
     //myPanel.setOpaque(true); 
     myPanel.setBackground(Color.black); 
    } 

    public void setActionListeners() { 
     //bill amounts 
     buttons.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       num = num + (e.getActionCommand()); 
      } 
     }); 

     buttons.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        output1 = formatter.format(formatter.parse(num)); 
        myText1.setText(output1); 
       } catch (ParseException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     //tips 
     tBtn1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       tip = .15; 
      } 
     }); 
     tBtn2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       tip = .18; 
      } 
     }); 
     tBtn3.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       tip = .20; 
      } 
     }); 
    } 
} 
+1

至少告诉你发布的代码有什么问题,并提出一个更具体的问题,而不是一堆要求。 –

+1

欢迎来到Stack Overflow!你已经在你的问题中发布了很多代码,这使得我们(以及未来的读者)不清楚问题出在哪里。请将您的问题代码减少到10行或更少。请参阅:[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)和[如何调试小程序](https://ericlippert.com/2014/03/05 /如何调试的小程序/)。 –

+0

当我点击gui上的一个数字时,它没有更新账单数量Jlabel从“00.00”到用户输入的数字 –

回答

1

你可以在同一个侦听做到既

button.addActionListener(new Actionlistener{ 
public void actionPerformed(ActionEvent ae){ 
//add code to update value of num 
//change text of Jlabel 
} 
}); 
3

您目前的ActionListener添加“按钮”这只是一个temporare引用创建一个按钮在'initializeButtons()'中。之后调用“setActionListeners”,而不是将ActionListener添加到初始化按钮时创建的最后一个按钮。

我会推荐不使用按钮类变量,而是使用本地变量按钮。

您可以通过添加的ActionListener在初始化按钮解决这个问题:

public void initializeButtons() { 
    ... 
    //Buttons Loop 
    for (int col = 50; col <= 190; col = col + 70) { 
     for (int row = 253; row <= 393; row = row + 70) { 
      JButton button = new JButton("" + i); 
      // bill amounts 
      button.addActionListener(new ActionListener() { 

       public void actionPerformed(ActionEvent e) { 
        num = num + (e.getActionCommand()); 
        try { 
         output1 = formatter.format(formatter.parse(num)); 
         myText1.setText(output1); 
        } catch (ParseException e1) { 
         e1.printStackTrace(); 
        } 
       } 
      }); 
      ... 
     } 
    } 
} 
+0

谢谢 - 您是对的我没有注意到我没有将按钮动作侦听器分配给每个按钮。 –

+0

我有两个新问题,也许你可以提供你的意见。我在下面的评论中发布了它。 –

0

我的新的问题是这样的:我有两个问题,现在我的代码。第一个问题是,当我按任何数字按钮来添加帐单数量它不会显示在帐单数量textFeild我也想要的方式。如果用户输入9.我希望它显示“000.09”。如果现在用户输入5,我希望账单金额现在显示“000.95”。我明白,我的数学如果错了,我在Button动作侦听器中设置它的方式。我遇到的第二个问题是我添加了一个重置​​按钮,并希望它将textField中的值重置为原始值。在setResetListener()方法中,我为重置按钮创建了一个动作侦听器,以便它将双精度值转换回其原始值。我希望它再显示在textField上。但是,它不这样做。我也希望它能够将myPanel的背景重新着色为原来的黑色。我猜这是由于线程的问题?这是我迄今为止的代码。

package calculatorCW; 
import java.awt.Color; 
import java.awt.event.*; 
import java.text.DecimalFormat; 
import java.text.ParseException; 
import javax.swing.*; 
public class calGui 
{ 
    private int i=1; 
    double tip=0,finalAmount=0,amountTaxed=0; 
    String num="000.00",output1="000.00",output2="000.00"; 
    JFrame frame = new JFrame(); 
    JPanel myPanel = new JPanel(); 
    JLabel label1, label2, label3, label4; 
    JTextField myText1, myText2; 
    JButton buttons,tBtn1,tBtn2, tBtn3,calc,btn0,reset; 
    DecimalFormat formatter = new DecimalFormat(); 

    public calGui() 
    { 
     initializeLabels(); 
     initializeTextFields(); 
     initializeButtons(); 
     setPanels(); 
     setBounds(); 
     guiExtras(); 
     setTipListeners(); 
     setCalcListener(); 
    } 
    public void initializeLabels() 
    { 

     label1 = new JLabel("<html> <p style='font-size: 15px; color: red;'> TIP CALCULATOR </p></html>"); 
     label2 = new JLabel("<html> <p style='color: white;'> Bill Amount:</p></html> "); 
     label3 = new JLabel("<html> <p style='color: white;'>Tip Percentage: </p></html>"); 
     label4 = new JLabel("<html> <p style='color: white;'>Total Cost: </p></html>"); 
    } 
    public void initializeTextFields() 
    { 
     myText1 = new JTextField(output1); 
     myText2 = new JTextField(output2); 
    } 
    public void initializeButtons() 
    { 
     tBtn1 = new JButton("<html> <p style='color: blue;'>15 %</p></html>"); 
     tBtn2 = new JButton("<html> <p style='color: blue;'>18 %</p></html>"); 
     tBtn3 = new JButton("<html> <p style='color: blue;'>20 %</p></html>"); 
     calc = new JButton("<html> <p style='color: black;'>CALC</p></html>"); 
     reset = new JButton("<html> <p style='color: black;'>Reset</p></html>"); 
     btn0 = new JButton("0"); 
     //Buttons Loop 
       for (int col = 50; col<=190; col=col+70) 
        { 
         for(int row =253; row<=393; row=row+70) 
         { 
          buttons = new JButton(""+i); 
          myPanel.add(buttons); 
          buttons.setBounds(row, col, 60, 50); 
          buttons.setActionCommand(String.valueOf(i)); 
          setButtonsListeners(); 
          i++; 
         } 
        } 

    } 

    public void setPanels() 
    { 
     myPanel.add(tBtn1); 
     myPanel.add(tBtn2); 
     myPanel.add(tBtn3); 
     myPanel.add(calc); 
     myPanel.add(reset); 
     myPanel.add(btn0); 
     myPanel.add(label1); 
     myPanel.add(label2); 
     myPanel.add(label3); 
     myPanel.add(label4); 
     myPanel.add(myText1); 
     myPanel.add(myText2); 
    } 
    public void setBounds() 
    { 
     tBtn1.setBounds(23, 90, 60, 50); 
     tBtn2.setBounds(93, 90, 60, 50); 
     tBtn3.setBounds(163, 90, 60, 50); 
     calc.setBounds(13, 190, 100, 50); 
     reset.setBounds(13, 260, 100, 50); 
     btn0.setBounds(323, 260, 60, 50); 
     label1.setBounds(155,-5,200, 50); 
     label2.setBounds(13, 50, 100, 20); 
     label3.setBounds(13, 70, 200, 20); 
     label4.setBounds(13, 160, 100, 20); 
     myText1.setBounds(96, 50, 100, 20); 
     myText2.setBounds(96, 160, 100, 20); 
    } 
    public void guiExtras() 
    { 
     myPanel.setLayout(null); 
     myPanel.setSize(500,400); 
     frame.add(myPanel); 
     frame.setBounds(600,50,500,400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myText1.setEditable(false); 
     myText2.setEditable(false); 
     //myPanel.setOpaque(true); 
     myPanel.setBackground(Color.black); 
    } 

    public void setButtonsListeners() 
    { 
     //bill amounts 
     buttons.addActionListener(new ActionListener() 
     {@Override public void actionPerformed(ActionEvent e) 
     { 
      num=num+(e.getActionCommand()); 
      //buttons.setEnabled(true); 
      try { 
       output1=formatter.format(formatter.parse(num)); 
      } catch (ParseException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      myText1.setText(output1); 
     }}); 
    } 

    public void setTipListeners() 
    { 
     //tips 
     tBtn1.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {tip=.15;}}); 
     tBtn2.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {tip=.18;}}); 
     tBtn3.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {tip=.20;}}); 
    } 

    public void setCalcListener() 
    { 
     calc.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) 
     { 
      amountTaxed=(Double.parseDouble(output1)*tip)+Double.parseDouble(output1); 
      finalAmount=(amountTaxed*8.25)+amountTaxed; 
      try { 
       output2=formatter.format(formatter.parse(Double.toString(finalAmount))); 
      } catch (ParseException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      myText2.setText(output2); 
      myPanel.setBackground(Color.gray); 
      label1.setText(("<html> <p style='font-size: 15px; color: white;'> TIP CALCULATOR </p></html>")); 
     }}); 
    } 
    public void setResetListerner() 
    { 
     reset.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) 
     { 
      tip=0; 
      finalAmount=0; 
      amountTaxed=0; 
      num="000.00"; 
      output1="000.00"; 
      output2="000.00"; 
      myText2.setText(output2); 
      myText1.setText(output1); 
      myPanel.setBackground(Color.BLACK); 
      //myPanel.repaint(); 

     }}); 
    } 

    public static void main(String[] args) 
    { 
     new calGui(); 
    } 
} 
相关问题