2017-09-05 53 views
1

语境JOptionpane.showMessageDialog不是if语句的容器内工作(事件处理程序)

我试图建立使用JFrame的事件具有空白文本字段处理一个百分比计算器和“输入”按钮并根据他们点击哪个按钮显示答案(每个按钮有两个不同的计算)。

问题

的是,当我把JOptionPane.showMessageDialog行的if/else if语句(全部在actionPerformed方法),在程序运行中,但点击按钮什么都不做 。但是如果我把它放在陈述之外,它说答案变量未申报。我知道一个百分比计算器可以以其他更简单的方式完成,但这只是我想到的,并且想知道我是否可以做到这一点(我是一个完整的初学者)。

代码

public class PercentageCalc extends JFrame{ 
private JTextField item2, item4, item5, item7; 
private JButton button, button2; 

public PercentageCalc(){ 
    super("Percentage Calculator"); 
    setLayout(new FlowLayout()); 

    JLabel item1 = new JLabel("What is"); 
    add(item1); 

    JTextField item2 = new JTextField(3); 
    add(item2); 

    JLabel item3 = new JLabel("% of"); 
    add(item3); 

    JTextField item4 = new JTextField(2); 
    add(item4); 
    button = new JButton("Enter"); 
    add(button); 
    JLabel spacer = new JLabel("      "); 
    add(spacer); 

    JTextField item5 = new JTextField(3); 
    add(item5); 

    JLabel item6 = new JLabel("is what % of"); 
    add(item6); 

    JTextField item7 = new JTextField(3); 
    add(item7); 
    button2 = new JButton("Enter"); 
    add(button2); 


    thehandler handler = new thehandler(); 
    button.addActionListener(handler); 
    button2.addActionListener(handler); 
} 
private class thehandler implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     String strx; 
     String stry; 
     double x, y, answer; 
     if(e.getSource()==button){ 
      strx = item2.getText(); 
      stry = item4.getText(); 
      x = Double.parseDouble(strx); 
      y = Double.parseDouble(stry); 
      answer = y * 0.01 * x; 
      JOptionPane.showMessageDialog(null, answer); 
     } 
      else if(e.getSource()==button2){ 
      strx = item5.getText(); 
      stry = item7.getText(); 
      x = Double.parseDouble(strx); 
      y = Double.parseDouble(stry); 
      answer = x/y*100; 
      JOptionPane.showMessageDialog(null, answer); 
      } 
} 
+0

为了更好地帮助越早,张贴[MCVE]或[简要,独立的,正确的示例](http://www.sscce.org/)。 –

回答

1

你必须使用相同的名称成员变量和局部变量。请阅读erehere

这里是纠正变异的你的程序为您的按钮

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 
import javax.swing.WindowConstants; 

public class PrecentageCalc extends JFrame { 
    private JTextField item2, item4, item5, item7; 

    private JButton button, button2; 

    public PrecentageCalc() { 
     super("Percentage Calculator"); 
     setLayout(new FlowLayout()); 

     JLabel item1 = new JLabel("What is"); 
     add(item1); 

     item2 = new JTextField(3); 
     add(item2); 

     JLabel item3 = new JLabel("% of"); 
     add(item3); 

     item4 = new JTextField(2); 
     add(item4); 
     button = new JButton("Enter"); 
     add(button); 
     JLabel spacer = new JLabel("      "); 
     add(spacer); 

     item5 = new JTextField(3); 
     add(item5); 

     JLabel item6 = new JLabel("is what % of"); 
     add(item6); 

     item7 = new JTextField(3); 
     add(item7); 
     button2 = new JButton("Enter"); 
     add(button2); 

     thehandler handler = new thehandler(); 
     button.addActionListener(handler); 
     button2.addActionListener(handler); 
    } 

    private class thehandler implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      String strx; 
      String stry; 
      double x, y, answer; 
      if (e.getSource() == button) { 
       strx = item2.getText(); 
       stry = item4.getText(); 
       x = Double.parseDouble(strx); 
       y = Double.parseDouble(stry); 
       answer = y * 0.01 * x; 
       JOptionPane.showMessageDialog(null, answer); 
      } else if (e.getSource() == button2) { 
       strx = item5.getText(); 
       stry = item7.getText(); 
       x = Double.parseDouble(strx); 
       y = Double.parseDouble(stry); 
       answer = x/y * 100; 
       JOptionPane.showMessageDialog(null, answer); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frm = new PrecentageCalc(); 
     frm.pack(); 
     frm.setLocationRelativeTo(null); 
     frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frm.setVisible(true); 
    } 
} 
+0

进行这些更改会导致错误:当我单击按钮时(尽管程序仍在编译并运行),将出现“线程异常”AWT-EventQueue-0“java.lang.NullPointerException”。 –

+0

我刚刚编辑原始文章并发布了整个代码(减去导入的东西和主要方法,这是不相关的)。 –

+0

@OmarEldeeb我已更正我的回答 –

0

使用单独的ActionListeners。都使用相同的计算方法用不同的参数:

public PercentageCalc() { 

    // Part of your code 

    button.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     handleInput(item2.getText(), item4.getText()); 
    } 
    }); 

    button2.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     handleInput(item5.getText(), item7.getText()); 
    } 
    }); 

} 

private void handleInput(final String strx, final String stry) { 
    final double x = Double.parseDouble(strx); 
    final double y = Double.parseDouble(stry); 
    final double answer = y * 0.01 * x; 
    JOptionPane.showMessageDialog(null, answer); 
}