2009-07-11 3 views
2

나는 사용자에게 보여주고 싶은 두 개의 패널을 가지고있다. JTabbedPane에 추가하기로 결정했습니다. 또한 사용자가 동시에 두 사람의 옆에서 나란히 볼 수 있도록하고 싶습니다. 그래서 난 내 JTabbedPane에에 두 개의 패널을 추가 한 후 나는 같은 JSplitPanel을 만들어 :JSplitPanel (또는 JTabbedPane)의 문제점은 무엇입니까?

tabs.addTab("Align Image Points", imageControlPanel); 
    tabs.addTab("Align Map Points", mapControlPanel); 
    JSplitPane splitPane = new JSplitPane(
      JSplitPane.HORIZONTAL_SPLIT, true, imageControlPanel, 
      mapControlPanel); 
    tabs.addTab("Side by side view", splitPane); 

결과 JTabbedPane에 단 하나 개의 탭이! JSplitPane을 제거하면 모든 것이 정상적으로 작동합니다. 두 개의 탭. 그런 다음 문제를 단순화하여 여기 게시하고 시도해 보았습니다.

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JSplitPane; 
import javax.swing.JTabbedPane; 

public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame("Test"); 
     JButton b1 = new JButton("First"); 
     JButton b2 = new JButton("Second"); 
     JSplitPane s = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,b1,b2); 
     JTabbedPane tabs = new JTabbedPane(); 
     tabs.addTab("First", b1); 
     tabs.addTab("Second", b2); 
     tabs.addTab("Both", s); 
     f.getContentPane().add(tabs); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

다른 문제가 발생했습니다. 3 개의 탭을 표시하지만 세 번째 탭의 분할 창에는 버튼이 표시되지 않습니다!

제 질문은 JSplitPanel의 문제점은 무엇입니까? 다른 탭에 이미 표시된 개체를 표시 할 수 없습니까? 그것은 말도 안돼. 도와주세요.

(참고 : 나는 그들이 동일한 참조 할 수 원하는대로 내가 표시하려고 오전 구성 요소를 복제하고 싶지 않아)

답변

1

나는 당신과 같은 문제가있었습니다. 이 문제를 해결하기 위해 MVC 패턴 (Model-view-controller)으로 각 GUI를 만들었습니다. 컨트롤러는 gui 구성 요소를 반복적으로 사용하는 방법을 알고 있습니다.

각 Tab마다 GUI (View)의 새 인스턴스를 만들었지 만 컨트롤러가 GUI 흐름 및 동작을 처리하는 방법을 알고 있으므로 해당 GUI에 대한 컨트롤러 인스턴스를 생성자 매개 변수로 주입했습니다. GUIView1 및 GUIView2 컨트롤러에게 통지 할 수 있도록 컨트롤러로 모든 GUI 리스너를 등록 청취자위한 조치를 취한다

GUIView1Controller controller1 = new GUIView1Controller(); 
    GUIView2Controller controller2 = new GUIView2Controller(); 

    // Add new instance GUI ; however , use the same instance of controller 
    JSplitPane s = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true, 
         new GUIView1(controller1), new GUIView2(controller2)); 

    JTabbedPane tabs = new JTabbedPane(); 
    tabs.addTab("First", new GUIView1(controller1)); 
    tabs.addTab("Second", new GUIView2(controller2)); 
    tabs.addTab("Both", s); 

. GUIView1의 "First"탭이 변경 되더라도 "Both"탭의 GUIView1도 "First"탭의 GUIView1과 동일한 동작으로 업데이트됩니다.

단점은 탭과 JSplitPane에 GUIView의 새 인스턴스를 만들어야한다는 것입니다. 그러나 컨트롤러는 모든 GUI 이벤트 및 동작을 제어하고 공유 할 수 있습니다.

도움이되기를 바랍니다.

타이거.

+0

예, 탭에 "addChangeListener"를 추가 할 수 있으며 GUIView 인스턴스 하나만 만들 수 있으며 해당 변경 목록에 따라 gui 구성 요소를 앞뒤로 전환 할 수 있습니다. – Tiger

+0

답변 해 주셔서 감사합니다. 그것은 옳은 것 같습니다 (이 문제를 직접 해결 했으므로).하지만 실제로 구현할 때마다 더 나은 방법이 필요한 다른 프로그램을 찾았습니다. –

6

스윙 UI를 계층 적이며, 당신은 단지 계층에 구성 요소를 추가 할 수 있습니다 일단. 둘 이상의 컨테이너에 구성 요소를 추가하면 예기치 않은 결과가 발생합니다. 구성 요소를 복제하지 않으려면 JTabbedPane에 리스너가 필요합니다. 탭을 선택하면 JSplitView 또는 탭에서 각 구성 요소를 추가 및 제거 할 수 있습니다.

tabs.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent e) { 
     // Reorganise the display based on the current tab selection. 
    } 
} 
관련 문제