2013-10-13 1 views
0

스윙에서 GUI를 만드는 한 가지 기술적 측면에 대해 묻고 싶습니다. 내가또는 JDialog (많은 설정), 많은 작업 (설정, 동작, 데이터, 차트 표시 등 ...)으로 구성된 콘텐츠를 마음대로 생각해 봅시다. 예를 들어Java JFrame에서 많은 JPanels 스윙 - 게터 또는 모두 하나로?

: here 및 조직 그들 JPanels에 (그것을 MainPanel.java 이름을하자) 하나 개의 파일에 모든 구성 요소를 definie하는 것입니다 내가 지금하고 있어요

. A는 매우이다 (내 말은 그 의미가 내가 3-4없는 복잡한 패널이 때

private void organizePanels() { 
    pnlSettings = createPnlSettings(); 
    pnlActions = createPnlActions(); 
    pnlChart = createPnlChart(); 
    // ... 
} 

각 방법 등이 내부 구성 요소를 JPanel의 레이아웃을 설정하는 조직에 대한 책임이 각 패널을 구성하기위한 별도의 방법이 읽을 수있는). 그러나 좀 더 복잡한 구조를 만들면 악몽을 꾸미는 작은 일이 생기기 시작합니다. 각 클래스는 자신의 내부 구성 요소에 접근 (A 다른 JPanel에 JCombo 새로 고침에 영향을해야 JButtonJPanel에 클릭을해야한다 - 각 JPanel은 별도의 클래스 을 만들 경우 - : 나는 그런 접근 방식을 사용하려는 이유

). - 패널 간의 통신은 어떻게 든 MainPanel에 의해 제공되어야합니다.

그래서 mainPanel에서 JPanels에 대한 참조 만 있고 내부의 구성 요소에는 대한 참조가 없습니다. 특정 데이터에 액세스하는 데 조금 더 시간이 걸릴 것입니다. (대신 btnSave.setEnabled(true) 일 수 있지만 자연스러운 결과 일 수 있습니다.) JPanels의 모든 구성 요소를 공개 할 수 있습니다.

이 접근 방법이 정확한지 알고 싶습니까? 둘째 모든 시간을 접근 아니면 내 첫 번째 방법은없는 매우 복잡한 구조에 적합?

을 당신이 무슨 경험?

답변

1

GUI 응용 프로그램 디자인에서 매우 많은 것들이 그렇듯이 어느 것이 가장 좋은가는 결국 응용 프로그램 자체에 달려있는 절충 사항입니다. 많은 응용 프로그램에 적용되는 정답은 없습니다.

당신의 방법은 어떤 상황에서 효과가있을 수 있습니다.그러나 GUI 패널 구성에 대한 지식을 여러 클래스에 분산 시키면 유지 관리가 어려워 질 수 있습니다. 어떤 이유로 든 일부 단추 또는 단추 그룹을 다른 패널로 이동하려는 경우 데이터 액세스가 변경되므로 단추에 관계없이 데이터에 액세스하는 모든 위치에서 코드를 변경해야합니다.

패널의 데이터 만 포함하는 클래스를 디자인하여 어디서나 UI 의존성이 없도록 할 수 있습니다. Swing이나 다른 UI 패키지는 가져 오기 목록의 어느 곳에도 나타나지 않아야합니다. 예를 들어 SWT 또는 Spring MVC 또는 Windows 응용 프로그램에서이 클래스를 사용하려면 변경되지 않은 상태로 작업 할 수 있어야합니다. 그런 다음이 클래스의 싱글 톤 인스턴스에 대한 참조를 각 패널에 제공하고 필요에 따라 값을 가져오고 설정하게하십시오. 이렇게하면 데이터에 액세스하는 방법을 변경하지 않고 원하는 방식으로 UI를 변경할 수 있습니다.

이 메서드는 주어진 프레임/대화 상자에 대한이 "데이터 모델"이 복잡하지 않으므로 처리 할 클래스가 너무 복잡하다고 가정합니다. 복잡한 프레임의 경우 UI의 특정 부분에서만 액세스하고 해당 섹션 간의 액세스를 나누기 만하면 모델의 여러 부분에 액세스해야하기 때문에 섹션으로 분할 된 전체 모델을 고려할 수 있습니다.

0

을 당신이 올바른 방법에있다, 생각한다. 나는도를 도입하여 더 갈 것 패널 처리기 클래스 (정적 또는하지 않음). 이렇게하면 내부 관리에서 GUI 구성 요소 (JFrame 자체 포함)를 명확하게 분리 할 수 ​​있습니다 ment. 어떤 방식 으로든 패널 처리기의 공용 메서드를 통해 패널을 등록하십시오. 한 패널에서 다른 것이 발생하는 경우 이미 계획 한대로 패널에 핸들러에 문의하게합니다. 모든 패널에는 핸들러가 조작 할 수있는 방법을 결정하는 각각의 인터페이스가 있습니다. 이 개념 설계는 대형 애플리케이션에서 상당히 유용 할 수 있습니다. 왜냐하면 처리기가 패널 클래스 더미의 어딘가에서 기능을 숨기는 대신 가능한 모든 상호 작용을 요약하기 때문입니다.

모든 패널이 공유하는 메소드 나 변수를 inerhit으로 설정하여 개념 디자인을 향상시킬 수도 있습니다. 이렇게하면 코드의 일부 변경에 소요되는 시간과 노력이 줄어 듭니다. 더 많은 동시 프로그래밍을 사용하려는 경우 처리기 클래스를 사용하여 수행해야하는 모든 작업에 대한 쿼리를 만들 수 있습니다. 패널이 쿼리에 작업을 추가하게하고 처리기는 작업을 수행 한 다음 나중에 쿼리에서 제거합니다.