一、其实这个问题相当简单,那就是我想在Box 中放一个 Jpanel,但是放进去以后其他组件就都移位了,所以想请教下大家,怎么才能让它不移位。二、代码中注释掉的 setMSize 这个方法我的意图是将所有的组件都通过它来设置大小,但是不行,为什么会跳出 java.lang.NullPonintException 这个错误呢??三、我觉得JLabel比Jpanel来的实用,因为如果在这个程序上再放置如 Button、JTextField等组件,JLabel 是可以通过setLocationi()来定位的(但是JPanel就不行,JPanel想实现定位的话,那么必须将JFrame进行setLayout(null)才行,这样太吃力了,没个组件都得用绝对定位),而且也不能加入图片,所以我觉得如果 JLabel 比 JPanel 来的实用,JPanel我觉得不太有用。public class Test extends JFrame{
JLabel label1, label2, label3;
JPanel panel;
Box box;
public Test(){
label1 = new JLabel("label1");
label2 = new JLabel("label2");
label3 = new JLabel("label3");
panel = new JPanel();

label1.setOpaque(true);
label2.setOpaque(true);
label3.setOpaque(true);
label1.setBackground(Color.CYAN);
label2.setBackground(Color.BLUE);
label3.setBackground(Color.green);

Dimension size1 = new Dimension(350, 400);
box = Box.createVerticalBox();
box.setSize(size1);
box.setPreferredSize(size1);
box.setMaximumSize(size1);
box.setMinimumSize(size1);

setMSize(label1, 350, 100);
setMSize(label2, 350, 100);
setMSize(label3, 350, 100);

Dimension size2 = new Dimension(350, 100);
panel.setSize(size2);
panel.setPreferredSize(size2);
panel.setMaximumSize(size2);
panel.setMinimumSize(size2);

addComponent();
this.add(box);
}

private static void setMSize(JLabel c, int w, int h){
Dimension size = new Dimension(w, h);
c.setSize(w, h);
c.setPreferredSize(size);
c.setMaximumSize(size);
c.setMinimumSize(size);
}

// private static void setMSize(JComponent c, int w, int h){
// Dimension size = new Dimension(w, h);
// c.setSize(w, h);
// c.setPreferredSize(size);
// c.setMaximumSize(size);
// c.setMinimumSize(size);
// }

private void addComponent(){
box.add(label1);
box.add(label2);
// box.add(panel);
box.add(label3);
}

public static void main(String[] args){
Test test = new Test();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setSize(350, 400);
        test.setVisible(true);
}
}

解决方案 »

  1.   

    JPanel的Layout设置为Null之后就可以任意布局了啊。
      

  2.   

    如一楼所说的,我试过了,但是不行,但是为什么我发的这段程序,JPanel 的加入,其他组件就会移位呢(即便每个组件都通过 setLocation 来定位也会移位)?
      

  3.   

    把Panel的布局设置为Null就可以了。并且去掉你的那些setMSize方法。package test;import java.awt.Color;
    import java.awt.Dimension;import javax.swing.Box;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;public class Test extends JFrame{
        JLabel label1, label2, label3;
        JPanel panel;
        Box box;
        public Test(){
            label1 = new JLabel("label1");
            label2 = new JLabel("label2");
            label3 = new JLabel("label3");
            panel = new JPanel();
            panel.setLayout(null);
            
            label1.setOpaque(true);
            label2.setOpaque(true);
            label3.setOpaque(true);
            label1.setBackground(Color.CYAN);
            label2.setBackground(Color.BLUE);
            label3.setBackground(Color.green);
            
            Dimension size1 = new Dimension(350, 400);
            box = Box.createVerticalBox();
            box.setSize(size1);
            box.setPreferredSize(size1);
            box.setMaximumSize(size1);
            box.setMinimumSize(size1);
            
            setMSize(label1, 350, 100);
            setMSize(label2, 350, 100);
            setMSize(label3, 350, 100);
            
    //        Dimension size2 = new Dimension(350, 100);
    //        panel.setSize(size2);
    //        panel.setPreferredSize(size2);
    //        panel.setMaximumSize(size2);
    //        panel.setMinimumSize(size2);
            
            addComponent();
            this.add(box);    }
        
        private static void setMSize(JLabel c, int w, int h){
            Dimension size = new Dimension(w, h);
            c.setSize(w, h);
            c.setPreferredSize(size);
            c.setMaximumSize(size);
            c.setMinimumSize(size);
        }
        
    //    private static void setMSize(JComponent c, int w, int h){
    //        Dimension size = new Dimension(w, h);
    //        c.setSize(w, h);
    //        c.setPreferredSize(size);
    //        c.setMaximumSize(size);
    //        c.setMinimumSize(size);
    //    }
        
        private void addComponent(){
            box.add(label1);
            box.add(label2);
            box.add(panel);
            box.add(label3);
        }
        
        public static void main(String[] args){
            Test test = new Test();
            test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            test.setSize(350, 400);
            test.setVisible(true);
        }
    }
      

  4.   

    真是奇怪,上次我就没办法搞定,而且我还试着加了一个JTextField 并且对其进行绝对定位,居然也成功了,太奇怪了上次我搞不出,就用Jlabel代替了(后面我再试着把组件拆分,再组装看看行不行)。对了,那楼上的高人,你知道JPanel可以更换背景图片吗?JLabel就可以构造一个Image,JPanel有什么方法可以代替吗??
      

  5.   

    paintComponent方法,drawImage即可
      

  6.   

    你需要绝对定位pane.setLayout(null);
    JLabel l1=new JLabel("one");
    JLabel l2=new JLabel("two");
    JLabel l3=new JLabel("three");
    pane.add(l1);
    pane.add(l2);
    pane.add(l3);
    Insets insets=pane.getInsets();
    Dimension size=l1.getPreferredSize();
    l1.setBounds(25+insets.left,5+insets.top,size.width,size.height);
    size=l2.getPreferredSize();
    l2.setBounds(55+insets.left,40+insets.top,size.width,size.height);
    size=l3.getPreferredSize();
    l3.setBounds(100+insets.left,15+insets.top,size.width+50,size.height+20);
    注意容器改变后,需要重新部署或者刷新下GUI
      

  7.   

    null指针问题是没有设置属性值,还有移动问题是没有设置布局,4中布局方式总有一个可以搞定,gilt
    Layout,
      

  8.   

    以下是在JPanel里增加图片的方法,GUI好麻烦啊,难道就不能集成的方便一点嘛~~唉~public class HavaBgImagePanelextends JPanel {
    protected String backgroundImage = null;
    public HavaBgImagePanel(String imgUrl) {
    ImageIcon icon=new ImageIcon(imgUrl);
    this.backgroundImage = String.valueOf(icon);
    }
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Image img = Toolkit.getDefaultToolkit().getImage(backgroundImage);
    g.drawImage(img, 0, 0, null, this);
    }