Java 自定义窗体(标题栏、窗体背景)

您所在的位置:网站首页 设计类标题栏样式 Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

2024-07-13 00:07| 来源: 网络整理| 查看: 265

转自:http://hi.baidu.com/chengmaoning/item/b8e3b779ceb89d4a0e0a079c

最近在书上看到这篇文章,觉得挺有意思。与大家分享一下,具体可以参见明日科技出版的《Java经典编程300例》。

默认情况下,我们用java设计的界面窗体是这样的:

 

默认的标题栏、最大化、最小化、关闭按钮、窗体边框。

如何自定义窗体达到如下效果呢?

 

大致说下代码要点:

设置窗体的Undecorated属性为true,阻止窗体采用本机系统修饰,这样窗体就没有标题栏和边框了。

设计背景面板类。BackgroundPanel extends JPanel。

窗体面板添加标题栏面板,位置在上方。

标题栏面板添加背景面板显示标题栏图片、标题栏面板添加面板用于放置最大化、最小化、关闭按钮。

窗体面板添加背景面板在中间。contentPane.add(mianPanel,BorderLayout.Center);

添加按钮响应、添加标题栏拖动代码。

 

代码:

首先是带背景图片面板类:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 package  cn.chengmaoning.customframe;                      import  java.awt.Graphics;       import  java.awt.Image;                      import  javax.swing.JPanel;                      public  class  BackgroundPanel  extends  JPanel {                           /**             *              */      private  static  final  long  serialVersionUID = -898997756345637309L;            private  Image image;                           /**             * Constructor             */      public  BackgroundPanel() {                super ();                setOpaque( false );                setLayout( null );            }                           /**             * @param image             *            要设置的 image             */      public  void  setImage(Image image) {                this .image = image;            }                           @Override      protected  void  paintComponent(Graphics g) {                if  (image !=  null ) {                    int  width = getWidth(); // 获取组件大小                    int  height = getHeight();                    g.drawImage(image,  0 ,  0 , width, height,  this ); // 绘制图片与组件大小相同                }                super .paintComponent(g); // 执行超类方法            }                          }

其次再是主类:

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 package  cn.chengmaoning.customframe;                   import  java.awt.BorderLayout;      import  java.awt.Dimension;      import  java.awt.EventQueue;      import  java.awt.FlowLayout;      import  java.awt.GridLayout;      import  java.awt.Image;      import  java.awt.Point;      import  java.awt.event.ActionEvent;      import  java.awt.event.ActionListener;      import  java.awt.event.ItemEvent;      import  java.awt.event.ItemListener;      import  java.awt.event.MouseAdapter;      import  java.awt.event.MouseEvent;      import  java.awt.event.MouseMotionAdapter;                   import  javax.jws.Oneway;      import  javax.swing.ImageIcon;      import  javax.swing.JButton;      import  javax.swing.JFrame;      import  javax.swing.JPanel;      import  javax.swing.JToggleButton;                   public  class  ControlFormStatus  extends  JFrame {                        /**            *             */      private  static  final  long  serialVersionUID = -2214759764324605473L;           private  JPanel contentPane;           private  Point pressedPoint;                            /**            * @param args            */      public  static  void  main(String[] args) {               // TODO 自动生成的方法存根               EventQueue.invokeLater( new  Runnable() {                                            @Override              public  void  run() {                       // TODO 自动生成的方法存根                       try  {                           ControlFormStatus frame =  new  ControlFormStatus();                           frame.setVisible( true );                       }  catch  (Exception e) {                           // TODO: handle exception                           e.printStackTrace();                       }                   }               });           }                            /**            * Constructor            */      public  ControlFormStatus(){               setUndecorated( true );               setDefaultCloseOperation(EXIT_ON_CLOSE);               setBounds( 100 ,  100 ,  450 ,  300 );               contentPane =  new  JPanel();               contentPane.setBorder( null );               contentPane.setLayout( new  BorderLayout( 0 ,  0 ));               setContentPane(contentPane);                                    BackgroundPanel topPanel =  new  BackgroundPanel();               topPanel.addMouseMotionListener( new  MouseMotionAdapter() {                   @Override              public  void  mouseDragged(MouseEvent e){                       do_topPanel_mouseDragged(e);                   }               });               topPanel.addMouseListener( new  MouseAdapter() {                   @Override              public  void  mousePressed(MouseEvent e) {                       // TODO 自动生成的方法存根                       do_topPanel_mousePressed(e);                   }               });               Image centerImage =  new  ImageIcon(getClass().getResource( "frameTop.png" )).getImage();               Dimension dimension =  new  Dimension(centerImage.getWidth( this ), centerImage.getHeight( this ));               topPanel.setPreferredSize(dimension);               topPanel.setImage(centerImage);                                    contentPane.add(topPanel,BorderLayout.NORTH);               topPanel.setLayout( new  FlowLayout(FlowLayout.RIGHT,  5 ,  5 ));                                    JPanel panel =  new  JPanel();               panel.setPreferredSize( new  Dimension( 60 ,  22 ));               panel.setOpaque( false );               topPanel.add(panel);               panel.setLayout( new  GridLayout( 1 ,  0 ,  0 ,  0 ));                                    JButton button =  new  JButton( "" );               button.setRolloverIcon( new  ImageIcon(ControlFormStatus. class .getResource( "minBH.jpg" )));               button.addActionListener( new  ActionListener() {                                            @Override              public  void  actionPerformed(ActionEvent e) {                       // TODO 自动生成的方法存根                       do_button_actionPerformed(e);                   }               });               button.setFocusPainted( false );               button.setBorderPainted( false );               button.setContentAreaFilled( false );               button.setIcon( new  ImageIcon(ControlFormStatus. class .getResource( "minB.jpg" )));               panel.add(button);                                    JToggleButton button_1 =  new  JToggleButton( "" );               button_1.addItemListener( new  ItemListener() {                                            @Override              public  void  itemStateChanged(ItemEvent e) {                       // TODO 自动生成的方法存根                       do_button_1_itemStateChanged(e);                   }               });               button_1.setRolloverIcon( new  ImageIcon(ControlFormStatus. class .getResource( "maxBH.jpg" )));               button_1.setRolloverSelectedIcon( new  ImageIcon(ControlFormStatus. class .getResource( "maxBH.jpg" )));               button_1.setIcon( new  ImageIcon(getClass().getResource( "maxB.jpg" )));               button_1.setContentAreaFilled( false );               button_1.setBorderPainted( false );               button_1.setFocusPainted( false );               panel.add(button_1);                                    JButton button_2 =  new  JButton( "" );               button_2.addActionListener( new  ActionListener() {                                            @Override              public  void  actionPerformed(ActionEvent e) {                       // TODO 自动生成的方法存根                       do_button_2_actionPerformed(e);                   }               });               button_2.setRolloverIcon( new  ImageIcon(getClass().getResource( "closeBH.jpg" )));               button_2.setIcon( new  ImageIcon(getClass().getResource( "closeB.jpg" )));               button_2.setFocusPainted( false );               button_2.setContentAreaFilled( false );               button_2.setBorderPainted( false );               panel.add(button_2);                                    BackgroundPanel baclBackgroundPanel_1 =  new  BackgroundPanel();               Image topImage =  new  ImageIcon(getClass().getResource( "frameCenter.png" )).getImage();               baclBackgroundPanel_1.setImage(topImage);               contentPane.add(baclBackgroundPanel_1, BorderLayout.CENTER);                                }                        protected  void  do_button_2_actionPerformed(ActionEvent e) {               // TODO 自动生成的方法存根               dispose();           }                        protected  void  do_button_1_itemStateChanged(ItemEvent e) {               // TODO 自动生成的方法存根               if  (e.getStateChange() == ItemEvent.SELECTED) {                   setExtendedState(MAXIMIZED_BOTH);               }  else  {                   setExtendedState(NORMAL);               }           }                        protected  void  do_button_actionPerformed(ActionEvent e) {               // TODO 自动生成的方法存根               setExtendedState(ICONIFIED);           }                        protected  void  do_topPanel_mousePressed(MouseEvent e) {               // TODO 自动生成的方法存根               pressedPoint = e.getPoint();           }                        protected  void  do_topPanel_mouseDragged(MouseEvent e) {               // TODO 自动生成的方法存根               Point point = e.getPoint();               Point locationPoint = getLocation();                                    int  x = locationPoint.x + point.x - pressedPoint.x;               int  y = locationPoint.y + point.y - pressedPoint.y;                                    setLocation(x, y);           }                   }

代码中用到的图片如下:(我不知道有什么更好的方法可以把图片保存到这篇文章里,所以只有贴到这里了,试验的同学可以直接另存图片到本机,放置到与.java相同路径下即可)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3