2016-06-06 2 views
2

자바 스윙에서 2 차원 JSplitpane과 같은 디자인을 만들고 싶습니다. JFrame이 4 부분으로 분할되고 상단 부분과 하단 부분이 다른 분할로 분리되고 왼쪽 및 오른쪽 부분이 또 다른 분할 선으로 분리됩니다. 또한 수직 분할 선을 클릭하여 드래그하면 전체 선이 드래그 방향으로 이동해야합니다. Java Swing에서 2 차원 SplitPane을 만들려면 어떻게해야합니까?

ScreenShot

나는 분할 창에서 분할 창을 사용하여,이를 달성하기 위해 노력하고 있습니다. 그러나 수직 분할 선을 드래그하면 수평선 아래 또는 수평 분할 선 위로 구성 요소를 드래그합니다.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Demo extends JFrame { 

int screenwidth=760,screenheigth=550; 

JSplitPane top_sp,bottom_sp,main_sp; 

JButton b1,b2,b3,b4,b5,b6; 
JButton b7,b8,b9,b10; 

MailClient(){ 
    setSize(screenwidth,screenheigth); 
    setLayout(new BorderLayout()); 
    setTitle("Demo"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    setLocationRelativeTo(null); 

    b1=new JButton("B1"); 
    b2=new JButton("B2"); 
    b3=new JButton("B3"); 
    b4=new JButton("B4"); 
    b5=new JButton("B5"); 
    b6=new JButton("B6"); 
    b7=new JButton("B7"); 
    b8=new JButton("B8"); 
    b9=new JButton("B9"); 
    b10=new JButton("B10");  

    JPanel topleft=new JPanel(new FlowLayout()); 
    topleft.add(b1); 
    topleft.add(b2); 

    JPanel topright=new JPanel(new FlowLayout(FlowLayout.CENTER)); 
    topright.add(b3); 
    topright.add(b4); 
    topright.add(b5); 
    topright.add(b6); 

    JPanel bottomleft=new JPanel(new FlowLayout(FlowLayout.CENTER)); 

    bottomleft.add(b7); 
    bottomleft.add(b8); 
    bottomleft.add(b9); 
    bottomleft.add(b10); 

    JPanel bottomright=new JPanel(new FlowLayout(FlowLayout.CENTER)); 
    bottomright.add(new JLabel("TABLE")); 

    top_sp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,topleft,topright); 
    bottom_sp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,bottomleft,bottomright); 

    main_sp=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,top_sp,bottom_sp); 

    add(main_sp,"Center"); 

    setVisible(true); 
} 

public static void main(String args[]){ 
    Demo demo=new Demo(); 

} 

} 

답변

2

당신은 분할 구획 분할 이동 한 다음 다른 분할 창 위치 설정되었을 때 감지하는 속성 변경 리스너를 사용할 수 있습니다

import javax.swing.*; 
import java.awt.*; 

public class Example extends JFrame { 

    public Example() { 

     JPanel topLeftPanel = new JPanel(); 
     JPanel topRightPanel = new JPanel(); 
     JPanel bottomLeftPanel = new JPanel(); 
     JPanel bottomRightPanel = new JPanel(); 

     JSplitPane topPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, topLeftPanel, topRightPanel); 

     JSplitPane bottomPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, bottomLeftPanel, bottomRightPanel); 

     topPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, pce -> { 
      bottomPane.setDividerLocation((int) pce.getNewValue()); 
     }); 

     bottomPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, pce -> { 
      topPane.setDividerLocation((int) pce.getNewValue()); 
     }); 

     JSplitPane mainPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topPane, bottomPane); 

     setContentPane(mainPane); 
     setLocationRelativeTo(null); 
     setMinimumSize(new Dimension(400, 400)); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Example(); 
    } 
} 
1

당신이 분할 변경을 듣고있다 : 하나있는 JSplitPane의 크기를 변경할 때마다

split.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, 
    new PropertyChangeListener() { 
     @Override 
     public void propertyChange(PropertyChangeEvent pce) {} 
}); 

를 (자세한 내용은 Detecting JSplitPane Divider Movement 참조), 당신은 다른 변경해야 게다가.

split.setDividerLocation(proportionalLocation); 
+0

각 splitpane의 PropertyChangeListener에서 자신의 위치가 실제로 변경되는 경우 (new position! = old position) 다른 splitpane의 위치 만 변경해야합니다. 그렇지 않으면 두 splitpane 사이에서 끝없는 변경주기가 발생할 수 있습니다! –

1

당신은 또한 Split Pane Synchronizer을 확인 할 수 있습니다 .

2 개 이상의 분할 창을 동기화 할 수있는 재사용 가능한 클래스입니다. 클래스는 하나의 PropertyChangeListener을 사용하여 구분선 위치의 변경 사항을 관리하므로 응용 프로그램 코드는 각 분할 창을 개별적으로 추적하지 않아도됩니다.

관련 문제