2015-02-05 54 views
3

일부 정보를 표시하기 위해 두 개의 JSplitPanes을 사용합니다. 하나는 수평 분배기를 사용하고 다른 하나는 수직 분배기를 사용합니다. 다음 문제는 JSplitPanes 모두에 적용됩니다.JFrame 크기 조정 이동 JSplitPane 구분선

는 내 응용 프로그램의 주 JFrame, 그들은 화면의 일정 비율을 차지해야으로 JSplitPanes 또한 크기 조정 크기를 조정할 때 (모든 JPanelsJFrame 크기 조정에 적응, 행동은 MigLayout의 폭과 높이를 매개 변수로 설정).

분할 자 위치는 중요하며 JSplitPane 크기로 일정해야합니다. 이를 위해 setResizeWeight()setDividerLocation()을 사용합니다.

주요 문제 JFrame 리사이즈에 산기 0.0/0 %로 유지되지 않는다는 것이다 대신에 5 ~ 10 % ~ 이동 :

Pre-resize ----->를 Post-resize

나는 이것이 resizeWeight에 의한 것이라고 생각했지만, 그걸 가지고 놀았고 전혀 행동에 변화가 없었습니다.

누구든지이 문제를 해결할 수 있습니까? ComponentAdapter을 구현했지만 변수에 나누는 사람의 위치를 ​​저장하지 못했습니다. Preferences XML 키 componentResized()에 분배 자의 위치를 ​​복원 할 수 없습니다.

예제 코드 : 나는 @ChrisK와 같은 프로젝트에 대한 작업이 오늘을 살펴했다

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

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

import net.miginfocom.swing.MigLayout; 


public class JSplitPaneTest { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setMinimumSize(new Dimension(500, 500)); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new MigLayout()); 

     JPanel panel1 = new JPanel(); 
     panel1.setBackground(Color.RED); 

     JPanel panel2 = new JPanel(); 
     panel1.setBackground(Color.GREEN); 

     final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
       panel1, panel2); 
     splitPane.setResizeWeight(0.5); 
     splitPane.setOpaque(false); 
     splitPane.setOneTouchExpandable(true); // does not work on Linux :(
     splitPane.setBorder(null); 

     mainPanel.add(splitPane, "w 100%, h 90%, wrap"); 

     JButton button = new JButton("Set to 0"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       splitPane.setDividerLocation(0.0); 
      } 
     }); 

     mainPanel.add(button, "span"); 

     frame.add(mainPanel); 
     frame.setVisible(true); 
    } 
} 
+0

빨리 SSCCE/MCVE, short, runnable, compilable 게시 – mKorbel

+0

샘플 코드를 추가했습니다. . setResizeWeight()는 비헤이비어를 변경합니다. 그러나 분배기는 진정으로 0에 머 무르지 않습니다. – ChrisK

답변

1

. 나는이 문제를 해결했다고 믿지만, 윈도우 크기 조절에 의해 트리거 된 특정 증상을 확인하지는 못했습니다. (정적으로 크기가 조정 된 jSplitPane으로 이동하고 윈도우의 크기를 조정하면 더 이상 디바이더 위치가 변경되지 않기 때문입니다.) 그러나 같은 근본적인 문제로 인해 발생했다고 생각되는 또 다른 문제가있었습니다. 0 번 위치에서 디바이더를 이동 한 후에 더 이상 수동으로 0 번 위치로 드래그 할 수 없습니다. 이는 jPanel의 최소 크기로 인한 것으로 판명되었습니다. , 명시 적으로 설정되지 않았습니다. leftComponent.getMinimumSize()가 (임의로/임의로?) 32를 반환했음을 알았습니다. 디바이더를 마지막으로 드래그 할 수없는 가장 왼쪽 픽셀 위치가되었습니다.

따라서, 제가 한 일은 전화를했다 :

panel1.setMinimumSize(new Dimension(0,0)); 

은 디바이더가 왼쪽/상단에 모든 방법을 드래그 할 수 있도록하고 :

panel2.setMinimumSize(new Dimension(0,0)); 

는 분할 될 수 있도록 끝까지 오른쪽/아래로 끌었다.

이러한 값은 구성 요소 크기를 조정할 때 구분선 위치를 방해하는 것으로 생각됩니다. 패널 크기에 대한 임의의 최소값 (32x47)이 설정된 이유를 알 수 없었습니다. 이러한 값은, 패널을 구축 한 직후에 getMinimumSize에 의해 리턴됩니다. 누구나 계산 방법을 알면 상황을보다 완벽하게 파악할 수 있습니다. 도움이된다면 디바이더 드래그의 크기에서 splitpanes의 너비/높이는 정적으로 180으로 설정됩니다. 더 나은 도움을 위해

+0

1 년 전이 문제에 대한 연구를하면서 [이 게시물] (https://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in)을 보았습니다. -java-swi). 그것은 재미있는 읽을 수도 있습니다. – ChrisK

+0

현재이 문제를 해결할 수있는 유일한 해결책은 @kleopatra입니다. 비록 내가 당신만큼 스윙에 익숙하지 않더라도, 권할 만하지는 않을지 모르지만, 분할 창 분배기의 이러한 동작이 버그라고 생각했다고 생각하고, 그렇다면 고정 될 때까지 당신이 할 수있는 일은 그것으로 해결할 수있는 것 같습니다. – hepcat72

+0

두 번째 응답에서와 같이 콜셋 최소 크기 대신 getminimumsize를 재정의해야한다고 생각하십니까? – hepcat72