2016-10-24 27 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

それそれを使用しますEDTで呼び出された場合、 'invokeLater'は延期されます。 –

+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

チャームのように動作します。ありがとうございました! –

関連する問題