2011-08-06 2 views
0

자바에서 흥미로운 문제가 있습니다.Java에서 원시 객체 전달 및 편집

필자는 원하는 각 패널을 수동으로 디자인하는 대신 속성 창이 작동하도록 사용자 정의 가능한 Jpanel을 만들기로 결정했습니다. 난 그냥 사용자 정의 패널을 반복적으로 다른 매개 변수를 사용하여 생성자에서 "보고 편집"할 수 있으며, 나머지는 (레이아웃 속성 수신기 등) 할 것입니다.

내가 가지고있는 문제는 기본 객체를 패널에서 또는 패널로 전달하는 것입니다. 패널에서 값이 변경되면 프로그램에서 해당 값을 업데이트해야합니다. 이것은 프리미티브가 아닌 객체에서 쉽게 할 수 있습니다. 객체를 패널에 전달한 다음 패널에서 객체를 변경하면 주 프로그램에서 객체의 값도 변경됩니다. Boolean 및 int와 같은 기본 유형의 경우 실제 값은 참조가 아닌 Panel에 전달되므로 패널에서이 값을 변경하면 나머지 프로그램에는 영향을 미치지 않습니다.

이상적인 솔루션은 포인터를 사용하는 것입니다. 그러나 이들은 java에 존재하지 않습니다. 또 다른 해결책은 객체의 모든 정수 및 부울 유형을 캡슐화하는 것이지만 실제로는 주 프로그램에서 많은 코드를 다시 작성해야하므로이 작업을 수행하고 싶지는 않습니다.

이 작업을 수행 할 수있는 방법이 있어야하지만 그럴 생각이 없습니다.

미리 감사드립니다.

Chris.

+1

이벤트를 사용하여 새로운 데이터를 전달하려는 사람은 누구입니까? – Jeremy

+1

해당 속성이 primitve 또는 some 개체에 속해 있지 않습니까? 그 원시 가치의 부모는 누구입니까? 나는 당신이 뭔가를하고있는 것 같아 : 새로운 PropertiesPanel (someBeanObject, "someProperty"), someProperty 원시 또는 개체 수 있습니다. – chubbsondubs

답변

1

난 그냥 잘 로 메인 프로그램에서 개체의 값을 변경할 것, 다음 의 패널 객체를 변경 패널에 객체를 전달합니다. Boolean 및 int와 같은 기본 유형의 경우 실제 값 이 참조가 아닌 Panel에 전달되므로이 값을 패널의 값으로 변경하면 나머지 프로그램에는 영향을 미치지 않습니다.

그건 입니다.입니다. Java에서는 모든 것이 복사본 사본으로 전달됩니다. 달력의 참조는 해당 참조의 사본뿐만 아니라 객체를 가리키고 있으므로 참조가 참조하는 값을 변경하면 원하는대로 수행됩니다.

User.name (String) 및 User.age (int)를 사용하는 사용자가 있고 JTextField를 사용하여 수정하면 String과 같은 문제가 발생하지만 String은 프리미티브가 아닙니다. 문자열은 변경할 수 없으므로 참조를 가리키는 String을 변경할 수 있지만 통과 한 항목은 사본이므로 원본 개체는 영향을받지 않습니다.

// Invokes your Panel with a new copy of the string reference 
StringPropPanel ppun = new StringPropPanel (user.name); 
// Invokes your Panel with a new copy of the int reference 
IntPropPanel ppua = new IntPropPanel (user.age); 
// Invokes your Panel with a new copy of a User reference 
IntPropPanel ppup = new IntPropPanel (user.parent); 

마지막 질문은 작동하지만 질문을 올리면 사용자로부터 그러한 패널을 생성하는 방법입니다. 고유 트리거 추상 update 방법으로

PropPanel ppun = new PropPanel (user.name) { 
    public void update() { 
     user.setName (textfield.getText()); 
    } 
} 

PropPanel ppun = new PropPanel (user.age) { 
    public void update() { 
     user.setAge (Integer.parseInt (textfield.getText())); 
    } 
} 

, 익명 임시 구현에 의해 오버라이드 (override) 할 수있다, 당신은 더 성공적 일 수 있습니다.

3

저는 개인적으로 이것을 observer design pattern으로 사용하고 있습니다.이 방법을 사용하면 무엇인가 변경되면 해당 이벤트에 등록한 사람에게 이벤트를 시작할 수 있습니다. 이 동작을했을 그냥 기본 유형을 아니에요

주 - 당신이 설명하는대로 모든 불변의 유형 (. 예를 들어 문자열) 현재의 패턴이 주위

유일한 방법은 마무리이며, 모든 객체의 불리언 값과 주위의 값 전달. 가장 좋은 해결책은 아니지만, 관찰자 ​​패턴은 코드를 좀 더 유지 보수 가능하게 만들고 일반적으로 내 의견으로는 더 좋게 만들 것입니다.