swing

作者: SheBang_ | 来源:发表于2016-09-06 15:15 被阅读41次

    Swing结构图

    window我认为可以理解为容器,Jcomponent可以理解为组件,JPanel为面板,组件放在面板上,面板移动的时候,组件随之移动


    swing组件间结构

    创建一个居中面板

    package util;
    
    import java.awt.Component;
    import java.awt.Dimension;
    
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    //创建一个居中面板
    public class CenterPanel extends JPanel{
        private double rate;
        private JComponent c;
        private boolean strech;
        
        public CenterPanel(double rate,boolean strech){
            this.setLayout(null); //Container
            this.rate = rate;
            this.strech = strech;
        }
        
        public CenterPanel(double rate){
            this(rate,true);
        }
        
        public void repaint(){
            //Overrides: repaint() in Component
            if(null != c){
                //如果c不为空,那么获取
                Dimension containerSize = this.getSize(); //Component
                Dimension componentSize = c.getPreferredSize();
    //          如果入参有比例,那么就乘以比例,设置大小
                if(strech)
                    c.setSize((int)(containerSize.width * rate),(int)(containerSize.height * rate));
                else 
    //              如果没有比例就设置推荐大小
                    c.setSize(componentSize);
                c.setLocation(containerSize.width / 2 - c.getSize().width / 2 , containerSize.height / 2 - c.getSize().height/ 2);
            }
            super.repaint();
        }
        
        public void show(JComponent p){
    //      show方法是获取页面的元素,然后将他们移除,然后添加,
    //         在重绘制,重新绘制会调用repanint()方法,这时候会调整控件的大小
            this.c = p ;
            Component[] cs = getComponents();//container
            for (Component c: cs){
                remove(c);
            }
            add(p);
            this.updateUI();
            //Overrides: updateUI() in JComponent,调用repaint()方法
        }
        
        public static void main(String[] args){
            JFrame f = new JFrame();
            f.setSize(200, 200);
            f.setLocationRelativeTo(null);
            CenterPanel cp = new CenterPanel(0.85 ,true);
            f.setContentPane(cp);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
            JButton b = new JButton("abc");
            cp.show(b);
        }
    }
    

    swing中的线程

    swing中一共有三种线程,暂时先了解下,以后来深入研究:

    1. 初始化线程
      用于创建容器,组件,并显示,一旦创建并显示,初始化线程结束
    2. 事件调度线程
      所有和事件相关的操作都是在事件调度线程中完成的,比如点击一个按钮,对应的ActionListener.actionPerformed 方法中的代码
    3. 长耗时任务线程
      有一些长时间的操作,不能放在事件调度线程中,不然会让用户觉得页面很卡顿

    相关文章

      网友评论

          本文标题:swing

          本文链接:https://www.haomeiwen.com/subject/rxgfettx.html