2016-10-24 3 views
0

JSplitPane이 포함 된 JPanel이 있습니다. JPanel은 invokeAndWait 메소드를 사용하여 런타임 중에 JFrame에 주입됩니다. 그런 다음 invokeLater가 호출되어 SplitPane에서 구분선 위치를 업데이트합니다.
분할 자 업데이트가 호출 될 때 문제가 발생합니다. JPanel 너비는 여전히 0입니다.
잠자기 또는 중단 점을 코드의 아무 곳이나 추가하면 (invokeLater 제외) 코드가 올바르게 작동합니다.시작시 JSplitPane의 디바이더 위치를 설정하는 방법

final JPanel viewPanel = new JPanel(); 
    viewPanel.setLayout(new BorderLayout()); 

    final JPanel header = getPresenterHeader(getPageTitle(), getPageInstructions()); 
    viewPanel.add(header, BorderLayout.NORTH); 
    viewPanel.add(getSplitPane(), BorderLayout.CENTER); 

    toolbar = createActionsToolBar(); 
    toolbar.addAction(new ExitPresenterAction(this)); 
    viewPanel.add(toolbar, BorderLayout.SOUTH);  
    addContent(viewPanel); 

    SwingUtilities.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      splitPane.setDividerLocation(0.5); 
     } 
    }); 
+0

그것을 하지 말아야한다.'invokeLater'는 EDT에서 호출 될 때 연기 될 것이다. –

+0

예, 주위를 둘러 볼 수 없습니다. 'invokeLater'를 이해 했으므로 GUI가 확장 될 때까지 기다려야합니다. –

+1

다른 이벤트를 게시하기 전에 [이벤트 발송 스레드] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)에 Swing GUI 개체를 빌드하십시오 (예 : http://stackoverflow.com/a/5071109/230513). – trashgod

답변

1

나는 당신을 위해 할 수 있는지 모르겠지만, 우리는 대부분이 상황에서 도움이되는 방법이 있습니다

public static JSplitPane setDividerLocation(final JSplitPane splitter, final double proportion) { 
    if (splitter.isShowing()) { 
     if ((splitter.getWidth() > 0) && (splitter.getHeight() > 0)) { 
      splitter.setDividerLocation(proportion); 
     } else { 
      splitter.addComponentListener(new ComponentAdapter() { 
       @Override 
       public void componentResized(ComponentEvent ce) { 
        splitter.removeComponentListener(this); 
        setDividerLocation(splitter, proportion); 
       } 
      }); 
     } 
    } else { 
     splitter.addHierarchyListener(new HierarchyListener() { 
      @Override 
      public void hierarchyChanged(HierarchyEvent e) { 
       if (((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) && splitter.isShowing()) { 
        splitter.removeHierarchyListener(this); 
        setDividerLocation(splitter, proportion); 
       } 
      } 
     }); 
    } 
    return splitter; 
} 

대신 invokeLater 전화의 그것을 사용을

setDividerLocation(splitPane, 0.5); 
+0

매력처럼 작동합니다. 고맙습니다! –

관련 문제