2017-09-05 124 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); 
}