我想在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
}
答案 0 :(得分:5)
我实现了BorderLayout扩展来支持这一点。 UPD:使用小型测试应用http://java-sl.com/tip_multiple_floatable_toolbars.html
的相同代码在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);
}
}
}
}
}