2016-10-24 3 views
0

Ich habe JPanel, die JSplitPane enthält. Das JPanel wird während einer Laufzeit in einen JFrame mit der Methode invokeAndWait injiziert. Dann wird der InvokeLater aufgerufen, um die Teilerposition in SplitPane zu aktualisieren.
Das Problem ist, wenn das Teilerupdate aufgerufen wird, ist JPanel Breite immer noch 0 Wenn ich Schlaf oder einen Haltepunkt irgendwo im Code (außer dem InvokeLater) hinzufügen, funktioniert der Code gut.So legen Sie die Teilerposition für JSplitPane beim Start fest

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

Es sollte nicht, invokeLater wird aufgeschoben, wenn in EDT aufgerufen wird. –

+0

Ja, ich kann es nicht verstehen. Wie ich "invokeLater" verstehe, sollte es warten, bis die GUI erweitert wird. –

+1

Stellen Sie sicher, dass Sie Ihre Swing-GUI-Objekte im [Ereignisversand-Thread] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) erstellen, bevor Sie ein anderes Ereignis für [Beispiel] (http://stackoverflow.com/a/5071109/230513). – trashgod

Antwort

1

Ich bin nicht sicher, ob es für Sie hilft, aber wir haben eine Methode, die vor allem in dieser Situation hilft:

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; 
} 

es Verwenden Sie anstelle von invokeLater Anruf

setDividerLocation(splitPane, 0.5); 
+0

Funktioniert wie ein Charme. Vielen Dank! –

Verwandte Themen