package yangwei.ticket;import java.awt.Container;
import java.awt.FlowLayout;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class JPanelTest extends JPanel{

public JPanelTest()

{
setLayout(null);

}

public static void main(String [] args)
{
JFrame FrameTest = new JFrame();
JButton button1 = new JButton();
JButton button2 = new JButton();
button1.setBounds(50, 50, 50, 50);
button2.setBounds(100, 50, 50, 50);
JPanelTest testpanel = new JPanelTest();
// testpanel.setLayout(new FlowLayout());
testpanel.setLayout(null);
testpanel.add(button1);
testpanel.add(button2);
FrameTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FrameTest.setSize(500,500);
FrameTest.setLayout(null);//注释掉这一句Buttons就可以显示了
FrameTest.add(testpanel);
FrameTest.setVisible(true);
}}就比如上面这段代码当把JPanel和JFrame的布局同时设置为null时JPanel中的button就不能显示了,但如果把JFrame
中的
FrameTest.setLayout(null)
注释掉就没有问题了,请问这个是为什么呢?有人能解释下吗?

解决方案 »

  1.   

    setLayout(null),也即使用“无布局”或“绝对定位布局”模式。这种情况下,布局管理器不会自动设置控件大小,所以也就没得显示了。你需要对每个控件设置其位置与大小: setBounds()
      

  2.   

    button1.setBounds(50, 50, 50, 50);
    button2.setBounds(100, 50, 50, 50);我这2个地方不是设置了么?
    但是还是不显示了呢?
      

  3.   

    如果你把JFrame的Layout也设为NULL那么你的testpanel也要设置它所在的位置加上这句 testpanel.setBounds(0, 0, 400, 200);//这句要添加,因为你没有设置testpanle的位子
      

  4.   

    不好意思 这一句我测试的时候是写了的 发上来的时候忘了 麻烦看下下面这个例子:/**   
     * @Title: TicketPanel.java 
     * @Package src.com.fornew.tvm.ui.userui.mapcontrol.map; 
     * @Description: 线路选择面板
     * @Company:四川久远新方向
     * @author YangWei  
     * @date 2012-9-16 下午13:00:00
     * @version V1.0   
     */package src.com.fornew.tvm.ui.userui.mapcontrol.ticket;import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;import src.com.fornew.tvm.ui.userui.mapcontrol.control.TvmFrame;import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.LayoutManager;public class TicketPanel extends JPanel {
    /**
     * @ClassName: NodeEntityCollection
     * @Description: 线路选择面板
     * @author YangWei
     * @date 2012-9-16 下午13:00:00
     * 
     */
    private static final long serialVersionUID = 1L; private static int ticketWeight = TvmFrame.ScreenSize.width / 4; private static int ticketHeight = TvmFrame.ScreenSize.height ; private JButton oneYuan ; private JButton twoYuan; private JButton threeYuan; private JButton fourYuan; private JButton fiveYuan; private JButton sixYuan; private JButton sevenYuan; private JButton more;

    private JButton Englis_Chiness;

    private JButton Recharge;

    private JButton cancel; public TicketPanel() {// setLayout(new FlowLayout());
    setLayout(null);
    // setBackground(Color.blue);
    setBounds(3 * TvmFrame.ScreenSize.width / 4, 0, ticketWeight,ticketHeight);
    init();
            add(Englis_Chiness);
    setVisible(true);
    }

    public void init()
    {
    oneYuan = new JButton("1元");
    twoYuan = new JButton("2元");
    threeYuan = new JButton("3元");
    fourYuan = new JButton("4元");
    fiveYuan = new JButton("5元");
    sixYuan = new JButton("6元");
    sevenYuan = new JButton("7元");
    more = new JButton("更多");
    Englis_Chiness = new JButton("English");
    Englis_Chiness.setBounds(3*ticketWeight+10, 10, ticketWeight-10,50 );
    Recharge = new JButton("充值");
    cancel = new JButton("交易取消");
    }

    public static void main(String [] args)
    {
    JFrame f = new JFrame();
    f.setTitle("test");
    f.setBounds(0,0,TvmFrame.ScreenSize.width,TvmFrame.ScreenSize.height);
    f.setLayout(null);
    f.setVisible(true);
    f.add(new TicketPanel());
    f.repaint();
    }
    }
    这样为什么不能添加Button呢?
      

  5.   

    这是应为当把JPanel加到JFrame上去之后,JPanel的左上角的坐标变成了0搞定了 谢谢了