2010-09-09 13 views
18

Ben büyük bir JPanel üzerinde üç JToolBars gösteren bir GUI yapma sürecinde. Bu araç çubukları topluca çok büyüktür, bu yüzden JFrame sınırına ulaşırsa bir sonraki satıra sarmak için bir FlowLayout kullanıyorum. Sorun şu ki, bir sonraki satıra geldiklerinde, JPanel tarafından gizlendiler .. Keşke, tüm araç çubuklarını gösterecek kadar büyümek için araç çubuklarını içeren JPanel'i zorlayabilsem ..JToolBars'ın bir sonraki satıra (FlowLayout), altındaki JPanel gizlenmeden sarılmasına nasıl izin verebilirim?

Yapmanın bir yolu var mı? bu? Veya bu araç çubuklarını görünür hale getirmenin başka bir yolu var mı?

cevap

25

Daha önce bu soruna girdim. En iyi çözümün, FlowLayout'un değiştirilmiş bir sürümünü kullanıp dikey değişiklikleri dikkate aldığını ve bir sonraki satıra kaydırdığını buldum. İşte böyle bir düzen için kod.

import java.awt.*; 

/** 
    * A modified version of FlowLayout that allows containers using this 
    * Layout to behave in a reasonable manner when placed inside a 
    * JScrollPane 
    * @author Babu Kalakrishnan 
    * Modifications by greearb and jzd 
    */ 

public class ModifiedFlowLayout extends FlowLayout { 
     public ModifiedFlowLayout() { 
       super(); 
      } 

      public ModifiedFlowLayout(int align) { 
       super(align); 
      } 
     public ModifiedFlowLayout(int align, int hgap, int vgap) { 
      super(align, hgap, vgap); 
     } 

     public Dimension minimumLayoutSize(Container target) { 
      // Size of largest component, so we can resize it in 
      // either direction with something like a split-pane. 
      return computeMinSize(target); 
     } 

     public Dimension preferredLayoutSize(Container target) { 
      return computeSize(target); 
     } 

     private Dimension computeSize(Container target) { 
      synchronized (target.getTreeLock()) { 
      int hgap = getHgap(); 
      int vgap = getVgap(); 
      int w = target.getWidth(); 

      // Let this behave like a regular FlowLayout (single row) 
      // if the container hasn't been assigned any size yet 
      if (w == 0) { 
       w = Integer.MAX_VALUE; 
      } 

      Insets insets = target.getInsets(); 
      if (insets == null){ 
       insets = new Insets(0, 0, 0, 0); 
      } 
      int reqdWidth = 0; 

      int maxwidth = w - (insets.left + insets.right + hgap * 2); 
      int n = target.getComponentCount(); 
      int x = 0; 
      int y = insets.top + vgap; // FlowLayout starts by adding vgap, so do that here too. 
      int rowHeight = 0; 

      for (int i = 0; i < n; i++) { 
       Component c = target.getComponent(i); 
       if (c.isVisible()) { 
        Dimension d = c.getPreferredSize(); 
        if ((x == 0) || ((x + d.width) <= maxwidth)) { 
         // fits in current row. 
         if (x > 0) { 
         x += hgap; 
         } 
         x += d.width; 
         rowHeight = Math.max(rowHeight, d.height); 
        } 
        else { 
         // Start of new row 
         x = d.width; 
         y += vgap + rowHeight; 
         rowHeight = d.height; 
        } 
        reqdWidth = Math.max(reqdWidth, x); 
       } 
      } 
      y += rowHeight; 
      y += insets.bottom; 
      return new Dimension(reqdWidth+insets.left+insets.right, y); 
      } 
     } 

     private Dimension computeMinSize(Container target) { 
      synchronized (target.getTreeLock()) { 
      int minx = Integer.MAX_VALUE; 
      int miny = Integer.MIN_VALUE; 
      boolean found_one = false; 
      int n = target.getComponentCount(); 

      for (int i = 0; i < n; i++) { 
       Component c = target.getComponent(i); 
       if (c.isVisible()) { 
        found_one = true; 
        Dimension d = c.getPreferredSize(); 
        minx = Math.min(minx, d.width); 
        miny = Math.min(miny, d.height); 
       } 
      } 
      if (found_one) { 
       return new Dimension(minx, miny); 
      } 
      return new Dimension(0, 0); 
      } 
     } 

    } 
+0

Eşzamanlı (target.getTreeLock()) 'ne kullanılır? –

+0

@Jason Hesaplamaları iş parçacığı için saklamak. Ancak, hatta gerekli olup olmadığını bilmiyorum. Benim modifikasyonlarım asla senkronizasyonla uğraşmadı. – jzd

+0

Teşekkürler! Bu bana çok zaman kazandı, temiz bir çözüm de –