Java 在borderlayout区域中放置多个对象
我想在BorderLayout的一个区域中放置多个元素。正如在不同站点上所建议的那样,我使用了3个单独的面板,用于3个区域,并在每个面板的不同区域放置了2个元素。然而,我没有得到预期的结果。这是我的代码:Java 在borderlayout区域中放置多个对象,java,swing,layout-manager,Java,Swing,Layout Manager,我想在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
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);
}
}
有人能告诉我怎么纠正吗?在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的一个区域(南部)上。
对于具有多个浮动工具栏的示例,实现了多边框布局
/**
* 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);
}
}
}
}
}
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);
}
}
效果如下:
你能发布完整的课程吗?当然,我会编辑问题并将其包装在另一个面板中。在面板内嵌套面板并不违法。使用Swing时不要标记AWT。学习不同的方法以获得你想要的效果。每个面板可以有不同的LMS。抱歉,我会记住这些标签。请提供GUI的ASCII艺术(或带有简单图形的图像),因为它应该以最小的大小显示,并且(如果可以调整大小)具有额外的宽度/高度。-1
JPanel
默认使用FlowLayout
,因为您使用参数BorderLayout调用add()
。
将被忽略。感谢@alex2410-为面板添加BorderLayout
。我搞错了。。非常感谢!:)