2012-04-08 4 views
4

저는 처음 1 년 동안의 대학 프로젝트를 진행하고 있는데, 매우 복잡한 것 같지는 않지만 의심 스럽지만 문제가 있습니다. 그것에 대한 적절한 답을 찾으십시오.문자열을 다른 클래스에 전달합니다.

이 문제는 두 가지 클래스에 관한 것입니다. gui 클래스 (class1)와 다른 클래스 (class2)에서 클래스 2의 getText() String을 검색하려고 할 때 두 번째 클래스의 코드를 실행하면 nullpointerexception이 발생합니다.

클래스 1에 JTextField가 있고 class2에 .getText() 값을 전달하고 String 유형 변수에 저장하려고합니다. 가 (간체) 다음

내가 이것을 달성하기 위해 노력하고있어 현재 코드입니다 :

public class Class1 { 

    private JTextField textField = new JTextField("Something"); 

     public Class1() {} 
    ... 
    public String getTextFieldString() { 
     return textField.getText(); 
    } 
} 

public class Class2 { 

    public Class2(Class1 class1) { 
    c1=class1 
    } 
    private c1 Class1 = new Class1(); 
    private String s = new String(); 
    ... 
    s = c1.getTextFieldString(); 
} 

내가 코딩 꽤 새로운 해요, 어쩌면 내가 인수를 통과 할 필요가 읽었습니다 어딘가에 textField 자체가 정적이 아니기 때문에 누군가가 새로운 값을 입력하면 변경됩니다. (그곳에서 명백히 진술 해 주셔서 죄송합니다.)

어쨌든, 도움을 주시면 감사하겠습니다. 고마워요!

+0

자바가 객체 지향 원리를 구현하는 방법과 Java 참조 변수가 작동하는 방법에 대한 기본 사항을 먼저 읽어 보시기 바랍니다. 이것은 GUI 프로그래밍에 엄청난 도움이 될 것입니다. –

+0

그리고 정확히 내 대답과 같이'새로운 Class2 (c1)'을 호출하고 있습니까? –

+0

아, 코드의 맨 윗 부분 만 보았습니다. 당신은 그것을 일찌감치 제출 했어야합니다, 아니면 그냥 바보 일 가능성이 높습니다. – DanMc

답변

4

: 당신이 Class2 개체를 인스턴스화 이제

public class Class2 { 
    private Class1 class1; 
    public Class2(Class1 reference) { 
     class1 = reference; 
    } 
    public void someMethod() { 
     String s = class1.getTextFieldString(); 
    } 
} 

. 특히 textField 인스턴스 변수 이니셜 라이저는 유효한 Class1 인스턴스가 존재할 때까지 완료되어야합니다. 이 순서를 위반하는 한 가지 방법은 다른 스레드에 Class1Class2을 생성하는 것입니다. 이를 방지하기 위해 아래의 sscce과 같이 event dispatch thread에있는 만 스윙 GUI 객체를 구성하고 조작해야합니다. 만입니다.

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

/** @see http://stackoverflow.com/q/10067399/230513 */ 
public class NewJavaGUI extends JPanel { 

    public NewJavaGUI() { 
     Class1 class1 = new Class1(); 
     Class2 class2 = new Class2(class1); 
     this.add(class1.textField); 
     this.add(new JLabel(class2.s)); 
    } 

    private static class Class1 extends Object { 

     private final JTextField textField = new JTextField("Something"); 

     public Class1() {} // implicit 

     public String getTextFieldString() { 
      return textField.getText(); 
     } 
    } 

    private static class Class2 extends Object { 

     private final Class1 c1; 
     private final String s; 

     public Class2(Class1 class1) { 
      c1 = class1; 
      s = c1.getTextFieldString(); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("NewJavaGUI"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new NewJavaGUI().display(); 
      } 
     }); 
    } 
} 
2

누군가가 텍스트 필드의 텍스트를 수정하는시기를 알고 싶어합니다. 첫 번째 조언은 Swing 구성 요소에 관한 특정 질문이있을 때마다 Java 자습서를 살펴 보는 것입니다. 특히 Text Demo 예제를 포함하여 JTextField tutorial의 addActionListener 메소드를 살펴보십시오.

2

글쎄, 당신은 Class2의 생성자에서 Class1에 대한 참조를 전달하고 속성에 저장하고, 때마다 Class2 단순히 속성에 getText() 메소드를 호출, 텍스트를 필요로 할 수있다. 나는 자바에서 prescribedinitialization order을 검토하는 데 도움이 될 수 있습니다

Class1 c1 = new Class1(); 
Class2 c2 = new Class2(c1); 
+0

아, 정말 죄송합니다. 클래스 2의 class1에 대한 참조가 이미 있습니다. 이미 내가 제안한 것을 수행하고 있으며 여전히 작동하지 않는다고 생각합니다. 나는 더 명확해야하고, 코드를 편집하고 그 비트를 넣을 것이다. – DanMc

+0

'NullPointerException'을 얻는다면 그것은 어떤 객체 ('... = new ...')를 인스턴스화하는 것을 잊었다는 것을 의미한다. , 코드 어딘가에 –

관련 문제