2008-11-26 5 views
2

"디스플레이"JPanelJTextField이고 "컨트롤"이 JPanel이고 디스플레이의 내용에 액세스해야하는 버튼이 JPanelJFrame이 있습니다. 내 문제는 원칙적으로 이해하는 관찰자 패턴을 사용하는 방법과 관련이 있다고 생각합니다. 청취자를 배치하고 메시지를 업데이트해야하지만, 이들을 배치 할 수있는 방법, 한 패널에서 다른 패널로 액세스하는 방법 및 "datamodel"클래스를 도입하는 데 필요한 경우에 대한 단서가 없습니다. 예를 들어, 나는 제어판에서 JTextField의 내용에 액세스하려면 다음과 같이 익명의 액션 청취자를 사용JFrame에서 여러 JPanels에 액세스하는 방법은 무엇입니까?

JButton openfile = new JButton("Convert file"); 
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     openButtonPressed(); 
    }   
}); 

답변

1

:

또한 JTextField로의 유용에 대한 리스너에이 링크를 발견했다.

당신은 마스터 개체를 가질 수있다, 즉 모든 텍스트 필드와 버튼 (패널은 무관) 소유

그런 다음 마스터 객체 내에서의 separete의 ActionListener를 (내가 중재자 중재자 패턴을 참조 호출)

액션 리스너는 중재자에게 텍스트 필드의 값을 가져 와서 전송 객체를 생성하는 메소드를 수행합니다.

이렇게하면 패널, 텍스트 필드 등의 결합을 줄이고 컨트롤을 한 곳 (중재자)에서 제어 할 수 있습니다. 즉, 서로 알릴 수 없습니다.

는이 문제의 코드를 좀 걸릴 수 있습니다 : 그것은 코드를 실행에 이러한 개념을 보여줍니다 https://stackoverflow.com/questions/324554/#324559

.

BTW 관찰자 패턴은 이미 JTextField, JButton, ActionListener 등에 구현되어 있습니다. 후크를 추가하면됩니다.

이 정보가 도움이되기를 바랍니다.

수정 2 개의 답변을 하나로 합쳤습니다.

이것은 코드입니다.

class App { // this is the mediator 

    // GUI components. 
    private JFrame frame; 
    private JTextField name; 
    private JTextField count; 
    private JTextField date; 
    // Result is displayed here. 
    private JTextArea textArea; 

    // Fired by this button. 
    private JButton go; 

    private ActionListener actionListener; 


    public App(){ 
     actionListener = new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       okButtonPressed(); 
      } 
     }; 
    } 

    private void okButtonPressed(){ 
     // template is an object irrelevant to this code. 
     template.setData(getData()); 
     textArea.setText(template.getTransformedData()); 
    } 


    public void initialize(){ 

     frame  = new JFrame("Code challenge v0.1"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     name  = new JTextField(); 
     count = new JTextField(); 
     date  = new JTextField(); 
     textArea = new JTextArea(); 
     go  = new JButton("Go"); 
     go.addActionListener(actionListener); // prepare the button. 

     layoutComponents(); // a lot of panels are created here. Irrelevant. 
    } 
} 

전체 실행 코드가 here:

검색 할 수 있습니다 가능하면 상속을 통해 구성을 선호하는 것이 중요하다.

1

그것은 당신이 한 층에있는 모델을 만들 경우 코드 청소기을하고 추가 않습니다 레이어 또는 위의 두 구성 요소 및 레이아웃을 만들 수 있습니다. 확실히 JFrameJPanel 등을 확장하지 마십시오.

모델 계층의 컴포지션 계층을 디스플레이와 정확하게 일치시킬 필요가 없다고 생각하지 마십시오. 그런 다음 해당 텍스트를 Document에서 가져 와서 관련 작업을 수행하는 것입니다.

좋아, 그렇게 간단하지 않습니다. 스윙 모델은 조금 지저분합니다. 특히 ButtonModel은 뇌 손상을 입기 때문에 컨트롤러 영역이 완전히 순수하지는 않습니다.

0

우리는 어린이들로부터 부모 패널을 만드는 빌더라고 불렀습니다. 이 빌더에서는 듣고 싶은 모든 하위 구성 요소에 액세스 할 수 있으므로 거기에 논리를 구현할 수 있습니다.

마지막으로 빌더는 완전한 논리로 상위 패널을 리턴합니다.

부모 패널을 얻은 후에는 하위 구성 요소로 들어가는 혼란이 있으며 무엇이든 할 수 있습니다.

0

감사합니다. 어떻게 든 패널 간의 통신을 처리하는 데이터 모델 레이어를 추가했습니다. 당신은 이러한 개체 사이의 커플 링을 줄일 필요가

link text