2017-07-25 54 views
0

因此,基本上我开始学习Java的awt和swing库,并且在编写基本计算器时,我遇到的唯一问题是当您按下其中一个按钮执行操作时,结果标签在操作方法中是无法访问的,请注意它首先被实例化,并且当我使用同一个方法完成所有操作时(例如构造函数(实例化标签,获取输入并生成输出)),结果标签就会工作。无法设置类方法的标签文本

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
public class GUI extends JFrame { 
    JPanel panel=new JPanel(); 
    double a,b; 
public GUI(){ 
    setTitle("Calculator"); 
    setVisible(true); //Initializes window frame 
    add(panel); //Initializes window panel 
    input1(); 
    input2(); 
    result(); 
    addition(); 
    subtraction(); 
    multiplication(); 
    division(); 





    setSize(400,500); 
} 
void input1(){ //Sets Input 1 label and input box 
    JLabel lInput1=new JLabel("Input 1"); 
    lInput1.setForeground(Color.green); 
    panel.add(lInput1); 
    JTextField tInput1=new JTextField(4); 
    panel.add(tInput1); 
    a=Double.parseDouble(tInput1.getText()); //Saves the input on a variable for later usage 
} 
void input2(){ //Sets Input 2 label and input box 
    JLabel lInput2=new JLabel("Input 2"); 
    lInput2.setForeground(Color.green); 
    panel.add(lInput2); 
    JTextField tInput2=new JTextField(4); 
    panel.add(tInput2); 
    b=Double.parseDouble(tInput2.getText()); //Saves the input on a variable for later usage 
} 
void addition(){ //Sets addition button 
    JButton addition=new JButton("+"); 
    panel.add(addition); 
     addition.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
      result.setText(String.valueOf(a+b)); 
      } 
     }); 
} 
void subtraction(){ //Sets subtraction button 
    JButton subtraction=new JButton("-"); 
    panel.add(subtraction); 
     subtraction.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
      result.setText(String.valueOf(a-b)); 
      } 
     }); 
} 

void multiplication(){ //Sets multiplication button 
    JButton multiplication=new JButton("*"); 
    panel.add(multiplication); 
    multiplication.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
     result.setText(String.valueOf(a*b)); 
     } 
    }); 
} 
void division(){ //Sets division button 

    JButton division=new JButton("/"); 
    panel.add(division); 
     division.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
      result.setText(String.valueOf(a*b)); 
      } 
     }); 
} 
void result(){ 
    JLabel result=new JLabel(); 
    panel.add(result); 
} 
} 

错误出现在具有以下方法行:预先

result.setText(); 

感谢。

+2

'result'被声明为一个局部变量来了'result'方法,如果你希望能够访问在一个类的层次上,你将需要使它成为一个实例字段 – MadProgrammer

+0

也许[Java变量的范围](http://www.geeksforgeeks.org/variable-scope-in​​-java/)可能会更好地帮助 – MadProgrammer

+0

那么如何才能我这样做?我试图将方法和实例声明为公共的,但这是不可能的。 – Otomeram

回答

1

这是基本的Java 101,它可能值得花一些时间了解范围在Java中

最基本的答案是使变量的类的实例字段是如何工作的?

//... 
public class GUI extends JFrame { 
    //... 
    JLabel result=new JLabel(); 
    //... 
    void result(){ 
     panel.add(result); 
    }  
} 

这样,这将是整个对象

访问,但它说,只有最终被允许的结果实例

我很难相信它会被“要求”成为最终的,在这种情况下它不会受到伤害,但是您只是增加了复杂性,您可能还没有做好准备。如果你想沉默IDE /编译器警告,然后通过各种手段,将其标记为final

final JLabel result=new JLabel(); 
+0

这并不是说它必须是最终的,只是在添加修饰符的情况下,唯一可用的就是那一个。 – Otomeram

+0

我认为它确实需要它是最终的,因为它是从一个匿名类 –

+0

@AdamsonJeremiah我只需要'最后'如果它是一个局部变量,实例字段不受影响 – MadProgrammer