2011-11-16 85 views
3

我想在JFrame頂部放置兩個單獨的工具欄,並且能夠將每個工具欄單獨移動到框架的東,西或南,我嘗試使用BorderLayout,但這並沒有幫助,我知道我可以將每個人都放在BorderLayout的面板上,並且可以移動它們,但是我需要的是將它們放在彼此旁邊,並且能夠獨立移動每個人,這段代碼不起作用,但它將有助於理解我的問題,請任何人都可以幫助我?工具欄彼此相鄰

package test; 

import java.awt.Dimension; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class testform extends javax.swing.JFrame { 
    public testform() { 
     initComponents(); 
     jPanel1.removeAll(); 
     jPanel1.setPreferredSize(new Dimension(800,800)); 
     MultiBorderLayout amMultiBorderLayout = new MultiBorderLayout(0, 0); 
     jPanel1.add("North", jToolBar1); 
     jPanel1.add("North", jToolBar2); 
     jPanel1.add("Center",jPanel2); 
     jPanel1.setLayout(amMultiBorderLayout); 

     jPanel1.revalidate(); 

    } 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 
private void initComponents() { 

    jPanel1 = new javax.swing.JPanel(); 
    jPanel2 = new javax.swing.JPanel(); 
    jLabel1 = new javax.swing.JLabel(); 
    jToolBar1 = new javax.swing.JToolBar(); 
    jButton1 = new javax.swing.JButton(); 
    jToolBar2 = new javax.swing.JToolBar(); 
    jButton2 = new javax.swing.JButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 156, Short.MAX_VALUE) 
    ); 
    jPanel1Layout.setVerticalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 31, Short.MAX_VALUE) 
    ); 

    jLabel1.setText("jLabel1"); 

    javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); 
    jPanel2.setLayout(jPanel2Layout); 
    jPanel2Layout.setHorizontalGroup(
     jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() 
      .addContainerGap(43, Short.MAX_VALUE) 
      .addComponent(jLabel1) 
      .addContainerGap()) 
    ); 
    jPanel2Layout.setVerticalGroup(
     jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel2Layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jLabel1) 
      .addContainerGap(71, Short.MAX_VALUE)) 
    ); 

    jToolBar1.setRollover(true); 

    jButton1.setText("jButton1"); 
    jButton1.setFocusable(false); 
    jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); 
    jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); 
    jToolBar1.add(jButton1); 

    jToolBar2.setRollover(true); 

    jButton2.setText("jButton2"); 
    jButton2.setFocusable(false); 
    jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); 
    jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); 
    jToolBar2.add(jButton2); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(29, 29, 29) 
        .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 86, Short.MAX_VALUE) 
        .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(76, 76, 76) 
        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) 
      .addContainerGap()) 
     .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(0, 63, Short.MAX_VALUE) 
       .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(0, 64, Short.MAX_VALUE))) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addGap(31, 31, 31) 
      .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(64, Short.MAX_VALUE)) 
     .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(0, 103, Short.MAX_VALUE) 
       .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(0, 104, Short.MAX_VALUE))) 
    ); 

    pack(); 
}// </editor-fold> 

public static void main(String args[]) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 

     public void run() { 
      new testform().setVisible(true); 
     } 
    }); 
} 
// Variables declaration - do not modify 
private javax.swing.JButton jButton1; 
private javax.swing.JButton jButton2; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JPanel jPanel1; 
private javax.swing.JPanel jPanel2; 
private javax.swing.JToolBar jToolBar1; 
private javax.swing.JToolBar jToolBar2; 
// End of variables declaration 
} 

回答

5

我實現了BorderLayout擴展來支持這個。 UPD:同樣的代碼用一個小的測試應用程序http://java-sl.com/tip_multiple_floatable_toolbars.html

用它代替的BorderLayout這裏jPanel1.setLayout(new java.awt.BorderLayout());

import java.awt.*; 
import java.util.Vector; 

/** 
* Extends BorderLayout with multiple components in the northList, southList, eastList, westList 
* and centerList. Layout is used for correct working multiple toolbars. 
* 
* @author Stanislav Lapitsky 
* @version 1.0 
*/ 
public class MultiBorderLayout extends BorderLayout { 

    /** 
    * list of the northList region components 
    */ 
    Vector northList = new Vector(); 

    /** 
    * list of the southList region components 
    */ 
    Vector southList = new Vector(); 

    /** 
    * list of the westList region components 
    */ 
    Vector westList = new Vector(); 

    /** 
    * list of the eastList region components 
    */ 
    Vector eastList = new Vector(); 

    /** 
    * list of the centerList region components 
    */ 
    Vector centerList = new Vector(); 

    /** 
    * Constructs default layout instance. 
    */ 
    public MultiBorderLayout() { 
     super(); 
    } 

    /** 
    * Constructs new layout instance with defined parameters. 
    * 
    * @param hgap the horizontal gap. 
    * @param vgap the vertical gap. 
    */ 
    public MultiBorderLayout(int hgap, int vgap) { 
     super(hgap, vgap); 
    } 

    /** 
    * Adds the specified component to the layout, using the specified 
    * constraint object. For border layouts, the constraint must be one of the 
    * following constants: <code>NORTH</code>, <code>SOUTH</code>, <code>EAST</code> 
    * , <code>WEST</code>, or <code>CENTER</code>. <p> 
    * 
    * Most applications do not call this method directly. This method is called 
    * when a component is added to a container using the <code>Container.add</code> 
    * method with the same argument types. 
    * 
    * @param name   The feature to be added to the LayoutComponent 
    *  attribute. 
    * @param comp   the component to be added. 
    */ 

    //the method is deprecated but it's necessary to override it because current class extends 
    //BorderLayout to provide multiple components (toolbars) 
    public void addLayoutComponent(String name, Component comp) { 
     synchronized (comp.getTreeLock()) { 
      /* 
      * Special case: treat null the same as "Center". 
      */ 
      if (name == null) { 
       name = "Center"; 
      } 

      /* 
      * Assign the component to one of the known regions of the layout. 
      */ 
      if ("Center".equals(name)) { 
       centerList.add(comp); 
      } else if ("North".equals(name)) { 
       northList.insertElementAt(comp, 0); 
      } else if ("South".equals(name)) { 
       southList.add(comp); 
      } else if ("East".equals(name)) { 
       eastList.add(comp); 
      } else if ("West".equals(name)) { 
       westList.add(comp); 
      } else { 
       throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name); 
      } 
     } 
    } 

    /** 
    * Removes the specified component from this border layout. This method is 
    * called when a container calls its <code>remove</code> or <code>removeAll</code> 
    * methods. Most applications do not call this method directly. 
    * 
    * @param comp the component to be removed. 
    */ 
    public void removeLayoutComponent(Component comp) { 
     synchronized (comp.getTreeLock()) { 
      southList.remove(comp); 
      northList.remove(comp); 
      centerList.remove(comp); 
      westList.remove(comp); 
      eastList.remove(comp); 
     } 
    } 

    /** 
    * Determines the minimum size of the <code>target</code> container using 
    * this layout manager. <p> 
    * 
    * This method is called when a container calls its <code>getMinimumSize</code> 
    * method. Most applications do not call this method directly. 
    * 
    * @param target the container in which to do the layout. 
    * @return  the minimum dimensions needed to lay out the subcomponents 
    *  of the specified container. 
    */ 
    public Dimension minimumLayoutSize(Container target) { 
     synchronized (target.getTreeLock()) { 
      Dimension dim = new Dimension(0, 0); 

      Component c; 

      if (eastList.size() > 0) { 
       for (int i = 0; i < eastList.size(); i++) { 
        c = (Component) eastList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getMinimumSize(); 
        dim.width += d.width + this.getHgap(); 
        dim.height = Math.max(d.height, dim.height); 
       } 
      } 
      if (westList.size() > 0) { 
       for (int i = 0; i < westList.size(); i++) { 
        c = (Component) westList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getMinimumSize(); 
        dim.width += d.width + this.getHgap(); 
        dim.height = Math.max(d.height, dim.height); 
       } 
      } 
      if (centerList.size() > 0) { 
       for (int i = 0; i < centerList.size(); i++) { 
        c = (Component) centerList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getMinimumSize(); 
        dim.width += d.width; 
        dim.height = Math.max(d.height, dim.height); 
       } 
      } 
      if (northList.size() > 0) { 
       for (int i = 0; i < northList.size(); i++) { 
        c = (Component) northList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getMinimumSize(); 
        dim.width = Math.max(d.width, dim.width); 
        dim.height += d.height + this.getVgap(); 
       } 
      } 
      if (southList.size() > 0) { 
       for (int i = 0; i < southList.size(); i++) { 
        c = (Component) southList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getMinimumSize(); 
        dim.width = Math.max(d.width, dim.width); 
        dim.height += d.height + this.getVgap(); 
       } 
      } 

      Insets insets = target.getInsets(); 
      dim.width += insets.left + insets.right; 
      dim.height += insets.top + insets.bottom; 

      return dim; 
     } 
    } 

    /** 
    * Determines the preferred size of the <code>target</code> container using 
    * this layout manager, based on the components in the container. <p> 
    * 
    * Most applications do not call this method directly. This method is called 
    * when a container calls its <code>getPreferredSize</code> method. 
    * 
    * @param target the container in which to do the layout. 
    * @return  the preferred dimensions to lay out the subcomponents of 
    *  the specified container. 
    */ 
    public Dimension prefferedLayoutSize(Container target) { 
     synchronized (target.getTreeLock()) { 
      Dimension dim = new Dimension(0, 0); 

      Component c; 

      if (eastList.size() > 0) { 
       for (int i = 0; i < eastList.size(); i++) { 
        c = (Component) eastList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        dim.width += d.width + this.getHgap(); 
        dim.height = Math.max(d.height, dim.height); 
       } 
      } 
      if (westList.size() > 0) { 
       for (int i = 0; i < westList.size(); i++) { 
        c = (Component) westList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        dim.width += d.width + this.getHgap(); 
        dim.height = Math.max(d.height, dim.height); 
       } 
      } 
      if (centerList.size() > 0) { 
       for (int i = 0; i < centerList.size(); i++) { 
        c = (Component) centerList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        dim.width += d.width; 
        dim.height = Math.max(d.height, dim.height); 
       } 
      } 
      if (northList.size() > 0) { 
       for (int i = 0; i < northList.size(); i++) { 
        c = (Component) northList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        dim.width = Math.max(d.width, dim.width); 
        dim.height += d.height + this.getVgap(); 
       } 
      } 
      if (southList.size() > 0) { 
       for (int i = 0; i < southList.size(); i++) { 
        c = (Component) southList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        dim.width = Math.max(d.width, dim.width); 
        dim.height += d.height + this.getVgap(); 
       } 
      } 

      Insets insets = target.getInsets(); 
      dim.width += insets.left + insets.right; 
      dim.height += insets.top + insets.bottom; 

      return dim; 
     } 
    } 

    /** 
    * Lays out the container argument using this border layout. <p> 
    * 
    * This method actually reshapes the components in the specified container 
    * in order to satisfy the constraints of this <code>BorderLayout</code> 
    * object. The <code>NORTH</code> and <code>SOUTH</code> components, if any, 
    * are placed at the top and bottom of the container, respectively. The 
    * <code>WEST</code> and <code>EAST</code> components are then placed on the 
    * left and right, respectively. Finally, the <code>CENTER</code> object is 
    * placed in any remaining space in the middle. <p> 
    * 
    * Most applications do not call this method directly. This method is called 
    * when a container calls its <code>doLayout</code> method. 
    * 
    * @param target the container in which to do the layout. 
    */ 
    public void layoutContainer(Container target) { 
     synchronized (target.getTreeLock()) { 
      Insets insets = target.getInsets(); 
      int top = insets.top; 
      int bottom = target.getHeight() - insets.bottom; 
      int left = insets.left; 
      int right = target.getWidth() - insets.right; 

      Component c; 

      if (northList.size() > 0) { 
       for (int i = 0; i < northList.size(); i++) { 
        c = (Component) northList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        c.setSize(right - left, d.height); 
        c.setBounds(left, top, right - left, c.getHeight()); 
        top += d.height; 
       } 
      } 
      if (southList.size() > 0) { 
       for (int i = 0; i < southList.size(); i++) { 
        c = (Component) southList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        c.setSize(right - left, d.height); 
        c.setBounds(left, bottom - d.height, right - left, c.getHeight()); 
        bottom -= d.height; 
       } 
      } 
      if (eastList.size() > 0) { 
       for (int i = 0; i < eastList.size(); i++) { 
        c = (Component) eastList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        c.setSize(d.width, bottom - top); 
        c.setBounds(right - d.width, top, c.getWidth(), bottom - top); 
        right -= d.width; 
       } 
      } 
      if (westList.size() > 0) { 
       for (int i = 0; i < westList.size(); i++) { 
        c = (Component) westList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        Dimension d = c.getPreferredSize(); 
        c.setSize(d.width, bottom - top); 
        c.setBounds(left, top, c.getWidth(), bottom - top); 
        left += d.width; 
       } 
      } 
      if (centerList.size() > 0) { 
       for (int i = 0; i < centerList.size(); i++) { 
        c = (Component) centerList.get(i); 
        if (!c.isVisible()) { 
         continue; 
        } 
        c.setBounds(left, top, right - left, bottom - top); 
       } 
      } 
     } 
    } 

} 
+0

日Thnx你的答案。我創建這個類和編輯我的代碼,這樣使用它,但我獲得了emprty框架 public testform(){ initComponents(); jPanel1.removeAll(); jPanel1.setPreferredSize(new Dimension(100,100)); MultiBorderLayout amMultiBorderLayout = new MultiBorderLayout(0,0); jPanel1.setLayout(amMultiBorderLayout); amMultiBorderLayout.addLayoutComponent(「North」,jToolBar1); amMultiBorderLayout.addLayoutComponent(「North」,jToolBar2); jPanel1.revalidate(); } – ama

+0

將組件添加到容器而不是佈局。 – StanislavL

+0

是的,工作thnx,但每個工具欄移動到另一邊,像拖動第一個工具欄到西部,第二個東部不工作 – ama