/* I am trying to make a basic calculator in JAVA using swings. However, after adding
* actionlisteners to each of my buttons, the actionPerformed method is never called. I can't
*seem to figure out why .
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class calculator extends JApplet implements ActionListener
{
JLabel num1_label,num2_label,result_label;
JTextField t1,t2,t3;
JButton sum,sub,mul,div;
float num1,num2,res;
public calculator ()
{
Container contentPanel = getContentPane();
contentPanel.setLayout(new GridLayout(6,2));
JLabel num1_label = new JLabel("Number 1");
contentPanel.add(num1_label);
JTextField t1 = new JTextField(10);
contentPanel.add(t1);
JLabel num2_label = new JLabel("Number 2");
contentPanel.add(num2_label);
JTextField t2 = new JTextField(10);
contentPanel.add(t2);
JLabel result_label = new JLabel("Result");
contentPanel.add(result_label);
JTextField t3 = new JTextField(10);
contentPanel.add(t3);
JButton sum = new JButton("Add");
sum.addActionListener(this);
contentPanel.add(sum);
JButton sub = new JButton("Subtract");
sub.addActionListener(this);
contentPanel.add(sub);
JButton mul = new JButton("Multiply");
mul.addActionListener(this);
contentPanel.add(mul);
JButton div = new JButton("Divide");
div.addActionListener(this);
contentPanel.add(div);
}
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource() == sum)
{
addition();
}
if(ae.getSource() == sub)
{
subtraction();
}
if(ae.getSource() == mul)
{
multiplication();
}
if(ae.getSource() == div)
{
division();
}
}
public void addition()
{
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 + num2;
t3.setText(" " + res);
}
catch (NumberFormatException nfe)
{
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public void subtraction()
{
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 - num2;
t3.setText(" " + res);
}
catch (NumberFormatException nfe)
{
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public void multiplication()
{
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 * num2;
t3.setText(" " + res);
}
catch (NumberFormatException nfe)
{
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public void division()
{
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 / num2;
t3.setText(" " + res);
}
catch (NumberFormatException nfe)
{
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public static void main(String argsp[])
{
calculator c = new calculator();
}
}
質問する
6185 次
2 に答える
5
最初にボタンをメンバー変数として宣言してから、コンストラクター内で同じ変数名を使用します(再度宣言して初期化します)。これは、メンバー変数がすべてに等しいままであることを意味しnull
ます。これを修正するJButton
には、コンストラクターのボタンの初期化から先頭を削除するだけです。
JButton mul = new JButton("Multiply");
になります
mul = new JButton("Multiply");
ここで発生した変数名に関連する問題は、シャドウイングとして知られています。
そして完全な解決策。クラス名、変数宣言、フォーマットなどの変更に注意してください。
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Calculator extends JApplet implements ActionListener {
private JLabel num1_label;
private JLabel num2_label;
private JLabel result_label;
private JTextField t1;
private JTextField t2;
private JTextField t3;
private JButton sum;
private JButton sub;
private JButton mul;
private JButton div;
private float num1;
private float num2;
private float res;
public Calculator() {
Container contentPanel = getContentPane();
contentPanel.setLayout(new GridLayout(6, 2));
num1_label = new JLabel("Number 1");
contentPanel.add(num1_label);
t1 = new JTextField(10);
contentPanel.add(t1);
num2_label = new JLabel("Number 2");
contentPanel.add(num2_label);
t2 = new JTextField(10);
contentPanel.add(t2);
result_label = new JLabel("Result");
contentPanel.add(result_label);
t3 = new JTextField(10);
contentPanel.add(t3);
sum = new JButton("Add");
sum.addActionListener(this);
contentPanel.add(sum);
sub = new JButton("Subtract");
sub.addActionListener(this);
contentPanel.add(sub);
mul = new JButton("Multiply");
mul.addActionListener(this);
contentPanel.add(mul);
div = new JButton("Divide");
div.addActionListener(this);
contentPanel.add(div);
}
public void actionPerformed(ActionEvent ae) {
System.out.println("hhhhh");
if (ae.getSource() == sum) {
addition();
}
if (ae.getSource() == sub) {
subtraction();
}
if (ae.getSource() == mul) {
multiplication();
}
if (ae.getSource() == div) {
division();
}
}
public void addition() {
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 + num2;
t3.setText(" " + res);
} catch (NumberFormatException nfe) {
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public void subtraction() {
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 - num2;
t3.setText(" " + res);
} catch (NumberFormatException nfe) {
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public void multiplication() {
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 * num2;
t3.setText(" " + res);
} catch (NumberFormatException nfe) {
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public void division() {
try {
num1 = Float.parseFloat(t1.getText());
num2 = Float.parseFloat(t2.getText());
res = num1 / num2;
t3.setText(" " + res);
} catch (NumberFormatException nfe) {
t1.setText("0");
t2.setText("0");
t3.setText("0");
}
}
public static void main(String argsp[]) {
Calculator c = new Calculator();
}
}
于 2012-09-19T20:17:23.843 に答える
1
コンストラクターでこれを試してください:
sum.setActionCommand ("sum");
そしてあなたのactionPerformed質問で:
if ( ae.getActionCommand().equals("sum")) {
...
}
そして、すべてのボタンについても同じです。
于 2012-09-19T20:14:00.423 に答える