我想在BorderLayout的一个区域中放置多个元素。作为各种网站的建议,我在3个区域使用了3个独立的面板,并在每个面板的不同区域放置了2个元素。但是我没有得到理想的结果。这是我的代码:
public class Trial extends JFrame{
JPanel p1,p2,p3;
JLabel l1,l2,l3,l4,l5,l6;
Trial(){
p1=new JPanel();
p2=new JPanel();
p3=new JPanel();
l1=new JLabel("Hello");
l2=new JLabel("Hi");
l3=new JLabel("Welcome");
l4=new JLabel("Bye");
l5=new JLabel("Visit again");
l6=new JLabel("Thanks");
p1.add(l1,BorderLayout.NORTH);
p1.add(l2,BorderLayout.CENTER);
p2.add(l3,BorderLayout.CENTER);
p2.add(l4,BorderLayout.SOUTH);
p3.add(l5,BorderLayout.NORTH);
p3.add(l6,BorderLayout.SOUTH);
add(p1,BorderLayout.NORTH);
add(p2,BorderLayout.CENTER);
add(p3,BorderLayout.SOUTH);
}
public static void main(String[] args){
Trial t=new Trial();
t.setSize(500,500);
t.setVisible(true);
}
}
有人可以建议我如何纠正它吗?
答案 0 :(得分:0)
将基础面板添加到JFrame。
然后将所有面板添加到基本面板。
我已将所有面板添加到基本面板的南部。
也为您的理解提供了颜色 -
public class Trial extends JFrame{
JPanel p,p1,p2,p3;
JLabel l1,l2,l3,l4,l5,l6;
Trial(){
p=new JPanel();
p1=new JPanel();
p2=new JPanel();
p3=new JPanel();
p.setLayout(new BorderLayout());
p1.setLayout(new BorderLayout());
p2.setLayout(new BorderLayout());
p3.setLayout(new BorderLayout());
p.setBackground(Color.orange);
p1.setBackground(Color.yellow);
p2.setBackground(Color.red);
p3.setBackground(Color.LIGHT_GRAY);
l1=new JLabel("Hello");
l2=new JLabel("Hi");
l3=new JLabel("Welcome");
l4=new JLabel("Bye");
l5=new JLabel("Visit again");
l6=new JLabel("Thanks");
p1.add(l1,BorderLayout.WEST);
p1.add(l2,BorderLayout.CENTER);
p2.add(l3,BorderLayout.EAST);
p2.add(l4,BorderLayout.SOUTH);
p3.add(l5,BorderLayout.NORTH);
p3.add(l6,BorderLayout.SOUTH);
p.add(p1,BorderLayout.NORTH);
p.add(p2,BorderLayout.CENTER);
p.add(p3,BorderLayout.SOUTH);
add(p,BorderLayout.SOUTH);
}
public static void main(String[] args){
Trial t=new Trial();
t.setSize(500,500);
t.setVisible(true);
}
}
现在你可以看到在borderlayout的一个区域(南方)放置了多个组件。
答案 1 :(得分:0)
http://java-sl.com/tip_multiple_floatable_toolbars.html
对于具有多个可浮动工具栏的示例,实现了多边框布局。
/**
* 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
*/
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);
}
}
}
}
}
答案 2 :(得分:-1)
JPanel的默认布局是FlowLayout。 您应该为每个面板设置布局,如p1.setLayout(new BorderLayout());
以下是代码,希望它能为您提供帮助。
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.*;
public class Trial extends JFrame {
JPanel p1, p2, p3;
JLabel l1, l2, l3, l4, l5, l6;
Trial() {
p1 = new JPanel();
p1.setLayout(new BorderLayout());
p1.setBackground(Color.gray);
p2 = new JPanel();
p2.setLayout(new BorderLayout());
p2.setBackground(Color.yellow);
p3 = new JPanel();
p3.setLayout(new BorderLayout());
p3.setBackground(Color.pink);
l1 = new JLabel("Hello");
l2 = new JLabel("Hi");
l3 = new JLabel("Welcome");
l4 = new JLabel("Bye");
l5 = new JLabel("Visit again");
l6 = new JLabel("Thanks");
p1.add(l1, BorderLayout.NORTH);
p1.add(l2, BorderLayout.CENTER);
p2.add(l3, BorderLayout.CENTER);
p2.add(l4, BorderLayout.SOUTH);
p3.add(l5, BorderLayout.NORTH);
p3.add(l6, BorderLayout.SOUTH);
add(p1, BorderLayout.NORTH);
add(p2, BorderLayout.CENTER);
add(p3, BorderLayout.SOUTH);
}
public static void main(String[] args) {
Trial t = new Trial();
t.setSize(500, 500);
t.setVisible(true);
}
}
效果如下: