如何解决在设置JPanel的BoxLayout时出现“BoxLayout不能共享”错误?

3

我想在一个JPanel内设置BoxLayout,但不知道如何解决这个错误。

    Exception in thread "main" java.awt.AWTError: BoxLayout can't be shared
    at javax.swing.BoxLayout.checkContainer(BoxLayout.java:464)
at javax.swing.BoxLayout.invalidateLayout(BoxLayout.java:248)
at javax.swing.BoxLayout.addLayoutComponent(BoxLayout.java:281)
at java.awt.Container.addImpl(Container.java:1120)
at java.awt.Container.add(Container.java:410)
at chatmsg1.ProfilePanel.<init>(ProfilePanel.java:63)
at chatmsg1.ProfilePanel.main(ProfilePanel.java:108)
    Java Result: 1

这是代码!任何帮助都将不胜感激!!

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.management.ImmutableDescriptor;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

 class ProfilePanel extends JPanel{
 JLabel jl1,jl2,jl3,jl4,jl5,jl6,jl7,jl8,jl9,jl10;
 ImagePanel ip= new ImagePanel();
 JPanel jp1= new JPanel(new BorderLayout());
 JPanel labelpanel;
 static int textwidth=100; 
 static String uname, uage, usex, udept,   uheight="jjhkjhiuhiuhiuhiuhihihuihiuhiuhuhiuhiuhihihiuhhihhuhih",ubatch, ucontact, uemail;
public ProfilePanel() {
    this.labelpanel = new JPanel(new BoxLayout(labelpanel, BoxLayout.PAGE_AXIS));


    String html1 = "<html><body style='width: ";
    String html2 = "px'>";

    labelpanel.setSize(400, 400);
    jl1= new JLabel(""+html1+""+textwidth+html2+"<h1>"+uname+"</h1>");
//jl1.setSize(jl1.getPreferredSize());

    jl2= new JLabel(""+html1+""+textwidth+html2+uage);
//jl2.setSize(jl2.getPreferredSize());

    jl3= new JLabel(""+html1+""+textwidth+html2+usex);
//jl3.setSize(jl3.getPreferredSize());

    jl4= new JLabel(""+html1+""+textwidth+html2+udept);
 // jl4.setSize(jl4.getPreferredSize());

    jl5= new JLabel(""+html1+""+textwidth+html2+uheight);
//jl5.setSize(jl5.getPreferredSize());

    jl6= new JLabel(""+html1+""+textwidth+html2+ubatch);
//jl6.setSize(jl6.getPreferredSize());

    jl7= new JLabel(""+html1+""+textwidth+html2+ucontact);
//jl7.setSize(jl7.getPreferredSize());

  jl8= new JLabel(""+html1+""+textwidth+html2+uemail);
//jl8.setSize(jl8.getPreferredSize());

/*
labelpanel.add(jl1,BorderLayout.CENTER);
labelpanel.add(jl2,BorderLayout.SOUTH);
labelpanel.add(jl3,BorderLayout.SOUTH);
labelpanel.add(jl4,BorderLayout.SOUTH);
labelpanel.add(jl5,BorderLayout.SOUTH);
labelpanel.add(jl6,BorderLayout.SOUTH);
labelpanel.add(jl7,BorderLayout.SOUTH);
labelpanel.add(jl8,BorderLayout.SOUTH);

*/
labelpanel.add(jl1);
labelpanel.add(jl2);
labelpanel.add(jl3);
labelpanel.add(jl4);
labelpanel.add(jl5);
labelpanel.add(jl6);
labelpanel.add(jl7);
labelpanel.add(jl8);


jl1.setAlignmentX(0);
jl2.setAlignmentX(0);
jl3.setAlignmentX(0);
jl4.setAlignmentX(0);
jl5.setAlignmentX(0);
jl6.setAlignmentX(0);
jl7.setAlignmentX(0);


ip.setImage("icons/1.jpg");
ip.setSize(200, 200);
//jl1.setSize(jl1.getPreferredSize());
jp1.add(ip, BorderLayout.CENTER);
jp1.setPreferredSize(jp1.getPreferredSize());
jp1.setBounds(20, 20, ip.getwidth(), ip.getheight());

//add(jp1,BorderLayout.CENTER );
//add(jl1,BorderLayout.WEST);
add(jp1);
add(labelpanel);
labelpanel.setLocation(jp1.getX()+jp1.getWidth()+20,0 );
labelpanel.setBounds(jp1.getX()+jp1.getWidth()+20,0 ,300, 400);
setLayout(null);
setPreferredSize(getPreferredSize());
setLocation(0, 0);
//setBounds(10, 10, 600, 600);
setVisible(true);

    }





    public static void main(String args[]){
        ProfilePanel p1= new ProfilePanel();
        p1.setSize(600, 600);
        JFrame jf= new JFrame("propanel");

        jf.setBounds(100, 100, 600, 600);
        jf.setLayout(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);

        jf.getContentPane().add(p1);
   // jf.pack();

    }
    }

ImagePanel是另一个JPanel,它将图像添加到该面板。如果有任何方法可以使此面板自动适应主Jframe的调整大小和所有组件,请告诉我。我正在学习Java,作为新手,我对它不是很了解。非常感谢任何帮助!谢谢

2个回答

10

BoxLayout 需要传递容器,但在创建布局管理器时 labelpanel 为 null。因此,您需要在创建布局管理器之前创建面板:

this.labelpanel = new JPanel();
labelpanel.setLayout(new BoxLayout(labelpanel, BoxLayout.PAGE_AXIS));

顺便提一下,在代码的另一个部分中,请摆脱您使用的null布局 - 这些不是好主意,所以最好养成从一开始就始终使用布局管理器的习惯。


有什么想法在这种情况下哪种布局管理器会更好。如果我想让它们随着JFrame大小的变化而可调整! - Sunny Dhaliwal
@SunnyDhaliwal 这将取决于您想要实现什么。 - MadProgrammer
@MadProgrammer 我正在尝试使用Java GUI,我将把这个面板(ProfilePanel)添加到JScrollPane中,并尝试给它一个类似Win8的Metro界面的效果。在这两个实验中,当鼠标悬停在每个面板上时,该面板将会展开或调整大小,同时其内容大小也会改变。我认为通过将我的想法付诸实际代码的方式是学习Java的更好方法。 - Sunny Dhaliwal

4

尝试使用以下更加简单易懂的方式...

this.labelpanel = new JPanel();
this.labelpanel.setLayout(new BoxLayout(labelpanel, BoxLayout.PAGE_AXIS));

在你的代码中,当传递给 BoxLayout 的引用时,由于 labelpanel 尚未实例化,所以将会是 null

谢谢您先生。这是您的第二个成功,毫不奇怪这代表了您的声誉!!哈哈 - Sunny Dhaliwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接