我正在制作一个在大JPanel上方显示三个JToolBar的GUI的过程中。这些工具栏总体上非常大,因此如果它们到达JFrame边界,我将使用FlowLayout使其缠绕到下一行。问题是,当它们换行到下一行时,它们将由下面的JPanel隐藏。.我希望我可以强制包含工具栏的JPanel增长到足以显示所有工具栏的程度。
有没有办法做到这一点?还是有其他方法可以使这些工具栏可见?
我以前遇到过这个问题。我发现最好的解决方案是使用FlowLayout考虑到垂直更改的修改版本,并将其包装到下一行。这是这种布局的代码。
FlowLayout
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); } } }