문제

나는있다 JFrame "디스플레이"가 포함되어 있습니다. JPanel ~와 함께 JTextField 그리고 "컨트롤" JPanel 디스플레이의 내용에 액세스 해야하는 버튼으로 JPanel. 내 문제는 원칙적으로 내가 이해하는 관찰자 패턴을 사용하는 방법과 관련이 있다고 생각합니다. 청취자를 배치하고 메시지를 업데이트해야하지만,이를 어디에 두어야하는지, 한 패널에서 다른 패널로 액세스하는 방법 및 "Datamodel"클래스를 소개하는 데 필요한 경우 단서가 없습니다. 예를 들어, 나는 JTextField 제어판에서 익명 액션 리스너를 다음과 같이 사용합니다.

JButton openfile = new JButton("Convert file");
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        openButtonPressed();
    }           
});
도움이 되었습니까?

해결책

이 객체들 사이의 커플 링을 줄여야합니다.

모든 텍스트 필드와 버튼을 소유 한 마스터 객체를 가질 수 있습니다 (패널은 관련이 없습니다)

그런 다음 해당 마스터 객체 내의 Separete ActionListener (중재자라고 부릅니다. 중재자 패턴 참조).

이 조치 리스너는 중재자에 대한 메소드를 수행하여 TextFields의 값을 가져 와서 전송 객체를 생성합니다.

이렇게하면 패널, 텍스트 필드 등의 커플 링을 줄이고 한 곳 (중재자)의 제어를 서로 알리지 않습니다.

이 질문에서 코드를 살펴볼 수 있습니다.https://stackoverflow.com/questions/324554/#324559

코드 실행에 이러한 개념을 보여줍니다.

BTW 옵저버 패턴은 이미 JTEXTFIELD, JBUTTON, ACTIONLISTENER 등에서 구현되었습니다. 후크를 추가하면됩니다.

이게 도움이 되길 바란다.

편집하다 두 개의 답변에 하나에 합류했습니다.

이것은 코드입니다.

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.
    }
}

완료 및 실행 코드를 검색 할 수 있습니다 여기:

가능하면 상속을 통해 구성을 선호하는 것이 중요합니다.

다른 팁

하나의 레이어로 모델을 생성하고 위의 레이어 또는 두 개를 추가하여 구성 요소와 레이아웃을 만들면 코드를 클리너로 만듭니다. 확실히 좋아하는 것을 확장하지는 않습니다 JFrame 그리고 JPanel.

모델 레이어의 구성 계층 구조가 디스플레이와 정확히 일치 할 필요가 없다고 생각하지 마십시오. 그럼 그것은 단지 텍스트를 가져 오는 문제 일뿐입니다. Document 관련 작업을 수행합니다.

좋아, Perhpas는 그렇게 간단하지 않습니다. 스윙 모델은 약간 지저분합니다. 특히 버튼 모델은 뇌 손상이며 코드의 컨트롤러 영역이 완전히 순수하지 않을 수 있습니다.

우리는 소위 건축업자를 가지고 있으며, 이는 어린이들로부터 부모 패널을 만들 것입니다. 이 빌더에서는 듣는 데 필요한 모든 하위 구성 요소에 액세스 할 수 있으므로 모든 논리를 구현할 수 있습니다.

마지막으로 건축업자는 완전한 논리로 부모 패널을 반환합니다.

부모 패널이 있으면 실제로 아동 구성 요소를 얻는 데 엉망이되어 무엇이든 할 수 있습니다.

감사해요. 패널 간의 통신을 처리하는 데이터 모드 층을 추가했습니다.

또한 Jtextfield 유용한 리스너 에서이 링크를 찾았습니다.

링크 텍스트

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top