JFrame 내부에서 여러 jpanel에 액세스하는 방법은 무엇입니까?
-
11-07-2019 - |
문제
나는있다 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는 그렇게 간단하지 않습니다. 스윙 모델은 약간 지저분합니다. 특히 버튼 모델은 뇌 손상이며 코드의 컨트롤러 영역이 완전히 순수하지 않을 수 있습니다.
우리는 소위 건축업자를 가지고 있으며, 이는 어린이들로부터 부모 패널을 만들 것입니다. 이 빌더에서는 듣는 데 필요한 모든 하위 구성 요소에 액세스 할 수 있으므로 모든 논리를 구현할 수 있습니다.
마지막으로 건축업자는 완전한 논리로 부모 패널을 반환합니다.
부모 패널이 있으면 실제로 아동 구성 요소를 얻는 데 엉망이되어 무엇이든 할 수 있습니다.