2011-11-28 3 views
3

반환을 사용하지 않고 클래스 B의 메소드에서 클래스 A의 객체를 어떻게 업데이트합니까? 예를 들어Java - 다른 클래스의 객체 업데이트

:

public class A { 
//my main class 

private javax.swing.JTextField txtField1; 
//a text field (txtField1) is initialized in this class and drawn 

} 


public class B { 

public void doSomething(){ 

    //does something and updates the txtField1 in class A 

} 

} 

다시 한 번, 내 복귀가 이미 같은 방법에서 다른 값을 반환하기 때문에 반환을 사용하지 않으.

답변

4

많은이 있습니다

이에 말 (변경하려는 속성이 "개인"키워드를 가지고 있기 때문에), 당신은
public void setTxtField1Value(String newValue){ 
this.txtField1.value=newValue; // using the right method in api. I am not familiar with gui.. 
} 

다음 B에, 방법이 될 것이다있다 당신이 이것을 달성 할 수있는 방법. 가장 간단한 클래스 B의 방법으로 개체를 전달하는 것입니다 :
public void doSomething(JTextField fieldToUpdate){ 
    //your logic here 
    fieldToUpdate.setText("something"); 
} 

그런 다음 당신은 그냥 직접 fieldToUpdate를 업데이트 할 수 있습니다. 이것은 1 클래스가 소유 한 변수의 제어를 다른 클래스에 직접 노출하기 때문에 좋은 디자인 패턴이 아닙니다.

또 다른 대안은 공공 방법을 방법으로 클래스 A의 인스턴스를 전달하고 호출하는 것입니다 :

public void doSomething(A aInstance){ 
    //your logic here 
    aInstance.setText("something"); 
} 

다음 클래스 A에서 당신이

public void setText(String text){ 
    txtField1.setText(text); 
} 

입니다 정의해야 할 것 클래스 B는 클래스 A의 내부에 직접 액세스 할 수 없으므로 조금 더 좋아집니다.

더 많은 캡슐화 된 응답 (이 간단한 경우에 잔인 함에도 불구하고)은

public class A implements TextDisplayer{ 

public void setText(String txt){ 
    txtField1.setText(txt); 
} 

} 

후 인터페이스 :

public interface TextDisplayer{ 
public void setText(String txt); 
} 
클래스 A에서 다음

public void doSomething(TextDisplayer txt){ 
    //your logic here 
    txt.setText("something"); 
} 

미세한 페스 및 클래스 B의 방법에 대한 인터페이스를 구현하는 클래스의 인스턴스를 전달할

이 접근법의 장점은 클래스 B가 클래스 A와 완전히 분리되어 유지된다는 것입니다. 관심있는 것은 setText 메소드를 처리하는 방법을 알고있는 것이 전달된다는 것입니다. 다시 말하지만,이 경우에는 아마도 과도한 행동 일 수 있습니다.하지만 가능한 한 클래스의 분리를 유지하는 방식입니다.

+0

답변 해 주셔서 감사합니다. aInstance가 루프 내부에 있다면 어떻게 될까요? setText 메서드에서 doSomething 메서드로 반환하는 방법을 확인하려면 어떻게해야합니까? – jadrijan

0

당신이 중 하나는 클래스 A의 메소드를 호출하거나 텍스트 필드 정적 (좋은 생각)를 확인해야합니다.

는 사용에 따라 클래스 A는 등 스윙 노동자 /로 B를 인스턴스화 할 수 있습니다. 필요한 구체적인 정보를 B에게 제공하십시오. 그 반대의 경우도 있습니다. B은`A를 인스턴스화합니다.

0

txtField1의 값을 변경하려면 A에 공개 설정 메소드가 있다고 가정합니다.

public class B { 

public void doSomething(A a){ 

    //does something and updates the txtField1 in class A 
a.setTxtField1Value("foobar"); 

} 
} 
+0

답장을 보내 주셔서 감사합니다. 만약에 a.setTxtField1Value ("foobar"); 루프 안에 있습니까?루프가 true 일 때 setTxtField1Value 메서드에서 doSomething 메서드로 반환하는 방법을 확인하려면 어떻게해야합니까? – jadrijan

관련 문제