java学习笔记69--组件,容器,布局管理器的使用

1)常用的容器类,Frame和Panel
    java.awt.Frame类:
        public class Frame extends Window{}
        java.awt.Frame是带有标题和边框的顶层窗口,它是java.awt.Window类的直接子类

        例如:
            Frame frame = new Frame();
            frame.setTitle("我的容器");
            frame.setSize(500,500);
            frame.setLocation(700, 300);
            frame.setBackground(Color.lightGray);
            frame.setResizable(true);
            frame.setVisible(true);
        
        注:frame要显示出来,最后一定要设置它的的可见性为true
        
        思考:怎么能让窗口每次位于屏幕的正中间
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        int width = (int) toolkit.getScreenSize().getWidth();
        int height = (int) toolkit.getScreenSize().getHeight();

    java.awt.Panel类:
        public class Panel extends Container{}
        Panel是最简单的容器类,也成为面板,应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板(嵌套)。
        注:Panel面板不能单独显示,必须把它放到Frame中

        例如:运行后显示不了,设置Panel的大小位置以及可见性也没用
            Panel panel = new Panel();
            panel.setSize(400, 400);
            panel.setLocation(700, 300);
            panel.setBackground(Color.blue);
            panel.setVisible(true);
        
        例如:运行后可以显示
            Frame frame = new Frame();
            Panel panel = new Panel();
            panel.setBackground(Color.blue);

            frame.setSize(400, 400);
            frame.setLocation(700, 300);
            frame.add(panel);
            frame.setVisible(true);

2)常用的容器类,JFrame JPanel    
    javax.swing.JFrame类:
        public class JFrame extends Frame{}
        
        例如:
            JFrame jFrame = new JFrame();
            jFrame.setTitle("我的容器");
            jFrame.setResizable(true);
            jFrame.setSize(500,500);
            jFrame.setLocation(700, 300);
            jFrame.setBackground(Color.lightGray);
            jFrame.setVisible(true);   

       javax.swing.JPanel类:
           public class JPanel extends JComponent
          JPanel是一般轻量级容器,作用及用法和java.awt.Panel类似,它也是不能单独显示的。
    

3)常用的组件类(主要以Swing的为主,除非Swing中没有该组件)
        javax.swing.JButton    按钮
            例如:
                JFrame jFrame = new JFrame();
                JPanel panel = new JPanel();
                
                JButton btn = new JButton("登录");
                panel.add(btn);
                
                jFrame.setSize(400, 400);
                jFrame.setLocation(700, 300);
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jFrame.add(panel);
                jFrame.setVisible(true);

        javax.swing.JCheckBox 复选框
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            JCheckBox jck1 = new JCheckBox("篮球");
            JCheckBox jck2 = new JCheckBox("足球");
            panel.add(jck1);
            panel.add(jck2);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
        

        javax.swing.ButtonGroup  按钮组
        javax.swing.JRadioButton 单选框
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            //需要把俩个单选按钮放到ButtonGroup中,表示为一组
            ButtonGroup bg = new ButtonGroup();
            JRadioButton rbtn1 = new JRadioButton("男");
            JRadioButton rbtn2 = new JRadioButton("女",true);
            bg.add(rbtn1);
            bg.add(rbtn2);

            panel.add(rbtn1);
            panel.add(rbtn2);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
        


        java.awt.Choice 下拉菜单
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            Choice ColorChooser = new Choice();
            ColorChooser.add("Green");
            ColorChooser.add("Red");
            ColorChooser.add("Blue");
            
            panel.add(ColorChooser);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
        
        javax.swing.JComboBox    下拉菜单
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            JComboBox<String> box = new JComboBox<>();
            box.addItem("test1");
            box.addItem("test2");
            box.addItem("test3");
            
            panel.add(box);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);

        javax.swing.ImageIcon    图片/图标
        javax.swing.JLabel        标签(可放置文本和图片)
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            JLabel label1 = new JLabel("大家好");
            JLabel label2 = new JLabel();
            label2.setIcon(new ImageIcon("src/com/briup/test/1.png"));
            
            panel.add(label1);
            panel.add(label2);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);

            注:按钮上也能类似的设置图片

        javax.swing.JList 显示数据列表并且允许用户选择一个或多个项的组件(按住ctrl键多选)
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            String[] data = {"one", "two", "three", "four"};
            JList<String> myList = new JList<String>(data);
            
            panel.add(myList);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);

        javax.swing.JScrollBar 滚动条
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            //垂直 VERTICAL, 水平 HORIZONTAL
            JScrollBar bar = new JScrollBar(JScrollBar.HORIZONTAL);
            bar.setPreferredSize(new Dimension(200, 20));
            bar.setMinimum(0);
            bar.setMaximum(100);
            bar.setValue(50);
            panel.add(bar);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
        
        
        javax.swing.JTextArea   文本域
        javax.swing.JScrollPane 滚动面板(一般结合其他组件使用)
            例如:结合文本域
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            //需要给panel换一个布局管理器
            panel.setLayout(new BorderLayout());
            JTextArea area = new JTextArea();
            area.setSize(100, 100);
            JScrollPane scrollPane = new JScrollPane(area);
            panel.add(scrollPane);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
        

        javax.swing.JTextField        文本框
        javax.swing.JPasswordField    密码框
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            JTextField field = new JTextField(10);
            JPasswordField passwordField = new JPasswordField(10);
            panel.add(field);
            panel.add(passwordField);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
        

        javax.swing.JMenuBar    菜单栏
        javax.swing.JMenu        菜单
        javax.swing.JMenuItem    菜单项
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            JMenuBar mBar = new JMenuBar();
            JMenu sMenu, gMenu;
            sMenu = new JMenu("系统");
            gMenu = new JMenu("工具");
            
            JMenuItem sItem, cItem, tItem;
            sItem = new JMenuItem("开始导航");
            cItem = new JMenuItem("刷新系统");
            tItem = new JMenuItem("退出系统");
            sMenu.add(sItem);
            sMenu.addSeparator();
            sMenu.add(cItem);
            sMenu.addSeparator();
            sMenu.add(tItem);
            
            JMenuItem xyItem, ycItem;
            xyItem = new JMenuItem("显示菜单");
            ycItem = new JMenuItem("隐藏菜单");
            gMenu.add(xyItem);
            gMenu.addSeparator();
            gMenu.add(ycItem);
            
            mBar.add(sMenu);
            mBar.add(gMenu);
                    
            panel.add(mBar);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);

        
        javax.swing.JDialog        对话框
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            JButton okBut = new JButton("确定");
            //参数1 对话框属于哪个窗口
            //参数2 对话框标题
            //参数3 弹框对话框后,是否阻止用户进行其他组件的操作
            JDialog dialog = new JDialog(jFrame, "提示信息", true);
            dialog.setBounds(730, 325, 350, 150);
            dialog.setLayout(new FlowLayout());
            dialog.add(okBut);
            
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
            dialog.setVisible(true);

            注:之后可以通过鼠标点击控制对话框的出现和消失
        
        
        javax.swing.JProgressBar    进度条
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            JProgressBar bar = new JProgressBar();
            //最小值为0
            bar.setMinimum(0);
            //最大值为100
            bar.setMaximum(100);
            //设置进度条中的值初始为0
            bar.setValue(0);
            //显示当前进度条的状态
            bar.setStringPainted(true);
            
            panel.add(bar);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
            bar.setValue(40);

        java.awt.Canvas    画布
            注:必须为Canvas创建子类并重写paint方法
            例如:
            JFrame jFrame = new JFrame();
            final JPanel panel = new JPanel();
            
            Canvas canvas = new Canvas(){
                @Override
                public void paint(Graphics g) {
                    g.drawLine(0, 0, panel.getWidth(), panel.getHeight());
                }
            };
            panel.setLayout(new BorderLayout());
            panel.add(canvas);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);


            注:尝试在画布对象创建完后,添加如下代码观察效果
            canvas.addMouseMotionListener(new MouseAdapter() {
                public void mouseDragged(MouseEvent e) {
                    int x = e.getX();
                    int y = e.getY();
                    Graphics g = canvas.getGraphics();
                    g.setColor(Color.RED);
                    g.fillOval(x, y, 10, 10);
                }
            });
            
            注:addMouseMotionListener和addMouseListener所支持的事件是有区别的

4)常用的布局管理器的使用
        注: JFrame的布局管理器默认是BorderLayout
            JPanel的布局管理器默认是FlowLayout

        BorderLayout    边界布局管理器
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            panel.setLayout(new BorderLayout());
            JButton north,south,west,east,center;
            north = new JButton("north");
            south = new JButton("south");
            west = new JButton("west");
            east = new JButton("east");
            center = new JButton("center");
            
            //把按钮添加到panel中,并指明添加到的位置
            panel.add(north,BorderLayout.NORTH);
            panel.add(south,BorderLayout.SOUTH);
            panel.add(west,BorderLayout.WEST);
            panel.add(east,BorderLayout.EAST);
            
            //panel.add(center)这样写和下面的效果是一样的
            //如果你不指定放到BorderLayout那个位置的时候
            //他会默认的把组件放到中间那个位置
            panel.add(center,BorderLayout.CENTER);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);

        
        FlowLayout        流式布局管理器
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            panel.setLayout(new FlowLayout());
            
            JButton[] buts = new JButton[50];
            for(int i=1;i<=buts.length;i++){
                if(i<10){
                    buts[i-1] = new JButton("0"+i);
                }else if (i<=50) {
                    buts[i-1] = new JButton(""+i);
                }
                panel.add(buts[i-1]);
            }
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
            

        GridLayout        网格布局管理器
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            panel.setLayout(new GridLayout(3,3));
            
            JButton[] buts = new JButton[9];
            //设置container的布局管理器为GridLayout
            //GridLayout(3,3)表示布局为3行3列
            
            //循环创建按钮并放到panel中
            for(int i=0;i<buts.length;i++){
                buts[i] = new JButton((i+1)+"");
                panel.add(buts[i]);
            }
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);

        CardLayout        卡片布局管理器
            例如:

            JFrame jFrame = new JFrame();
            final JPanel panel = new JPanel();
            
            panel.setLayout(new CardLayout());
            
            JPanel[] jPanels = new JPanel[4];
            //创建四个JPanel放到数组中并设置背景颜色
            jPanels[0] = new JPanel();
            jPanels[0].setBackground(Color.red);
            
            jPanels[1] = new JPanel();
            jPanels[1].setBackground(Color.blue);
            
            jPanels[2] = new JPanel();
            jPanels[2].setBackground(Color.cyan);
            
            jPanels[3] = new JPanel();
            jPanels[3].setBackground(Color.green);
            
            //向CardLayout布局管理器中放置组件的时候一定要给组件起一个名字
            panel.add("a",jPanels[0]);
            panel.add("b",jPanels[1]);
            panel.add("c",jPanels[2]);
            panel.add("d",jPanels[3]);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);
            
            注:现在所看到的结果是四个颜色不同的JPanel叠在一起的效果,看到是最上面一个JPanel
            可以在上面例子中加入以下代码,看效果如何.
            
            panel.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    //获得panel容器上面的布局管理器
                    //并转为CardLayout类型的对象
                    CardLayout cl = (CardLayout) panel.getLayout();
                    //显示CardLayout管理器中的下一个组件
                    //这个参数表示:在哪一个容器中设置的这个CardLayout管理器
                    cl.next(panel);
                    //cl.show(panel, "d");
                }
            });
        

        注:JPanel和JPanel之间可以嵌套,每个JPanel又可以设置为不同的布局管理器,这样就可以得到大都数想要的组件布局情况了
        
        
        自定义组件位置
            有些时候也可以不使用任何布局管理器,用户通过坐标自己设置组件位置。
            
            例如:
            JFrame jFrame = new JFrame();
            JPanel panel = new JPanel();
            
            //把布局管理器设置为null
            //表示不使用任何管理器
            panel.setLayout(null);
            JButton btn = new JButton("登录");
            //设置组件的大小和位置
            btn.setSize(100,30);   
            btn.setLocation(80,60);
            
            panel.add(btn);
            
            jFrame.setSize(400, 400);
            jFrame.setLocation(700, 300);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.add(panel);
            jFrame.setVisible(true);

猜你喜欢

转载自blog.csdn.net/onepiece_loves/article/details/88743588