日期:2014-05-20  浏览次数:20697 次

java 卡片布局管理器的一点小问题
Java code


import java.awt.*;
import java.awt.event.*;
public class CardLayoutDemo extends Frame implements MouseListener{

    private Button first=new Button("A");
    private Button second=new Button("B");
    private Button third=new Button("C");
    private CardLayout cl=new CardLayout();
    private Panel cards=new Panel();

    public CardLayoutDemo(String string){
        super(string);
        init();    //调用init方法
    }
    
    public void init(){
        setLayout(new BorderLayout());
        setSize(500, 500);
        
        Panel p=new Panel();
        p.setLayout(new FlowLayout());
        
        first.addMouseListener(this);
        second.addMouseListener(this);
        third.addMouseListener(this);
        
        p.add(first);
        p.add(second);
        p.add(third);
        
        add("North",p);
        cards.setLayout(cl);
        cards.add("First cards",new Button("AA"));
        cards.add("second Button",new Button("BB"));
        cards.add("third cards",new Button("CC"));
        add("Center",cards);
        
        addWindowListener(new WindowAdapter(){
            public void WindowClosing(WindowEvent evt){
                setVisible(false);
                dispose();
                System.exit(0);
            }
        });
        
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new CardLayoutDemo("ABCD");   //创建CardLayoutDemo类型变量    
    
    }
    
public void mouseClicked(MouseEvent evt){
    if(evt.getSource()==first){
    cl.first(cards);
}
else if(evt.getSource()==second){
    cl.first(cards);
    cl.next(cards);
}
else if(evt.getSource()==third){
    cl.last(cards);
}
}
    public void mouseEntered(MouseEvent arg0){
    }
    public void mouseExited(MouseEvent arg0){
    }
    public void mousePressed(MouseEvent arg0){
    }
    public void mouseReleased(MouseEvent arg0){
    }
    
}






有些地方一直搞不懂,请老手教下新手

1.前面学了其他的布局管理器。 都没看到 实例化布局管理器。这里有private CardLayout cl=new CardLayout(); 为什么要对布局器实例化对象呢?有什么用意吗?

2.init方法中 设置窗口布局和大小的时候 不需要先对Frame窗口实例化再调用吗? 为什么可以直接这样写?

3.在main中 为什么不需要设置对象啊?

4.为什么要在构造方法中调用init方法啊?

5.在cards中添加按钮 为什么需要些"first Button" 。为什么要写这个?能不写或随便写吗?

------解决方案--------------------
1、Frame默认的布局管理器是BorderLayout,容器都有默认布局管理器,所以不用设置,这个例子是卡片布局,所以要new 出来
2、CardLayoutDemo 继承 Frame 
3、 new CardLayoutDemo("ABCD"); 这句就已经new 了一个CardLayoutDemo对象。然后调用构造方法

------解决方案--------------------
你这个CardLayoutDemo的实例,没有继承Frame,也没有Frame的成员不会'有反应'
------解决方案--------------------
第一个代码通过调用父类的构造函数 将 实例化时传入的参数 作为了Frame的标题
你这个代码可以把参数 再传给init,然后在init中作为Frame创建时的参数,不过整个代码就没有原来的好,有点乱

------解决方案--------------------
1)new 个对象而已,用意就是创建个布局管理器罢了
2)init方法里是一些初始化代码,你不觉得把初始化代码放在一个名为“初始化”的函数里很专业么?特别是在初始化代码较多的时候。
3)同上
4)这个布局管理器有点特别,他被设计成给每个容器加个标识,你切换视图的时候就用这个标识。 那个“firest Button”就是个标识而已~ 你愿意的话可以叫它“阿猫阿狗”,注意不要有重复的标识~
------解决方案--------------------
在cards中添加按钮 为什么需要些"first Button" 。为什么要写这个?能不写或随便写吗?
这是为方便操作来定义的,只要可以明确区分就可以按自己要求定义