2017-10-03 21 views
0

JButton과 함께 ActionListener을 사용하여 값을 저장하는 데 문제가 있습니다. 나는 Java에 상당히 익숙하지 않으며, 프로그래밍의 클래스와 하위 클래스 방식에 100 % 자신감이 없다.JTextField에서 값을 저장할 때 Java에서 필드를 확인할 수 없습니다.

import java.ActionEvent; 
import javaActionListener; 
import javax.swing JButton; 
import javax.swing JPanel; 
import javax.swing.JTextField; 

public class Trial extends JPanel implements Action Listener { 

    private static final long serialVersionUID = 1L; 

    public Trial() { 
     setFrame(); 
    } 

    public void setFrame(){ 

     JFrame frame = new JFrame("Trial"); 
     JPanel panel = new JPanel(); 
     JTextField field = new JTextField(10); 
     JButton button = new JButton("Enter"); 
     button.addActionListener(this); 

     panel.add(field); 
     panel.add(button); 

     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

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

    @Override 
    public void actionPerformed(ActionEvent e) { 
     String s = field.getText(); 
     System.out.prinln("Button is pressed"); 
    } 
} 

필드가 actionPerformed 안에 정의되지 않은 이유는 무엇입니까? ActionEvent와 함께 놀았고, actionPerformed 함수 밖의 변수를 전달할 수없는 것 같습니다. 그러면 어떻게해야합니까? setFrame()을 자체 수업으로 이전해야합니까?

+0

왜 '시험'이 'JPanel'을 확장합니까? 그것을하는 것이 완전히 불필요한 것처럼 보입니다. –

+0

코드는 원래 코드의 스 니펫 일뿐입니다. 방금 질문에 필요한 코드 줄을 가져 왔습니다. –

답변

0

문제의 원인은 가변 필드의 범위에 있습니다.

자바에서 변수의 범위는 정의 된 코드 블록에 의해 설정됩니다. JTextField 필드는 setFrame 메소드 내에서 선언됩니다. 이는 변수가 setFrame 메소드에서만 볼 수 있음을 의미합니다.

전체 변수 내에서 필드 변수를 볼 수있게하려는 경우 actionPerformed 메서드에서 필드 변수에 액세스 할 수 있도록 인스턴스 변수를 만들 수 있습니다.

public class Trial extends JPanel implements Action Listener { 

    private static final long serialVersionUID = 1L; 
    private JTextField field; //Move your declaration to class level, making it an instance variable. 

    public Trial() { 
     setFrame(); 
    } 

    public void setFrame(){ 

     JFrame frame = new JFrame("Trial"); 
     JPanel panel = new JPanel(); 
     field = new JTextField(10); //Remove the declaration of the variable and just initialize it here. 
     JButton button = new JButton("Enter"); 
     button.addActionListener(this); 

     panel.add(field); 
     panel.add(button); 

     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

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

    @Override 
    public void actionPerformed(ActionEvent e) { 
     String s = field.getText(); //Now you can access field within any method in the class. 
     System.out.prinln("Button is pressed"); 
    } 
} 

위의 코드가 충분히 설명 할 수 있기를 바랍니다. 질문이 있으시면 알려주십시오. 자세히 말씀 드리겠습니다.

0

setFrame() 메서드는 필드를 만들고 초기화하지만 다른 메서드는 특정 속성을 사용하여 특정 개체에 액세스 할 수 없습니다.

이 시도 :

어떤 방법의 외부 -certain- 객체를 선언 한
public class Trial extends JPanel implements Action Listener { 

    JTextField field; 

    ..// omitted 

    public void setFrame() 
    { 
     JFrame frame = new JFrame("Trial"); 
     JPanel panel = new JPanel(); 
     field = new JTextField(10); 

    .. //omitted 

, 그것은 어떤 방법이 -certain- 개체에 액세스하고 수정할 수 평균 (또는 검색) 것에서 속성/방법.