John Jiang

          a cup of Java, cheers!
          https://github.com/johnshajiang/blog

             :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
            131 隨筆 :: 1 文章 :: 530 評(píng)論 :: 0 Trackbacks
          構(gòu)建不規(guī)則窗體
          在開發(fā)一個(gè)新浪微博Swing客戶端的過程中希望能展現(xiàn)不規(guī)則的窗體界面,原來JDK 6 update 10提供了創(chuàng)建指定形狀窗體的特性,簡(jiǎn)單易用,記于此處。(2010.05.31最后更新)

          Java從JDK 6 update 10開始將內(nèi)建支持構(gòu)建指定形狀的窗體,類com.sun.awt.AWTUtilities中的方法setWindowShape會(huì)根據(jù)不同的Shape實(shí)現(xiàn)去構(gòu)造相應(yīng)形狀的窗體。AWTUtilities類是放在SUN的包中,在使用該方法時(shí)應(yīng)該通過反射去進(jìn)行調(diào)用,如下代碼所示,
          Class<?> clazz = Class.forName("com.sun.awt.AWTUtilities");
          Method method 
          = clazz.getMethod("setWindowShape", Window.class, Shape.class);

          1. 創(chuàng)建正常窗體
          先創(chuàng)建一個(gè)簡(jiǎn)單的界面,它使用BorderLayout,在其中安放5個(gè)JButton,如下代碼所示,
          public class ShapedFrame extends JFrame {

              
          private static final long serialVersionUID = -2291343874280454383L;

              
          private JButton centerButton = new JButton("Center");

              
          public ShapedFrame() {
                  
          super("Shaped Frame");
                  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  initUI();
              }

              
          private void initUI() {
                  Container container 
          = getContentPane();
                  container.setLayout(
          new BorderLayout());

                  container.add(
          new JButton("TOP"), BorderLayout.PAGE_START);
                  container.add(
          new JButton("RIGHT"), BorderLayout.LINE_END);
                  container.add(
          new JButton("BOTTOM"), BorderLayout.PAGE_END);
                  container.add(
          new JButton("LEFT"), BorderLayout.LINE_START);
                  container.add(centerButton, BorderLayout.CENTER);
              }

              
          public static void main(String[] args) {
                  SwingUtilities.invokeLater(
          new Runnable() {

                      @Override
                      
          public void run() {
                          ShapedFrame frame 
          = new ShapedFrame();
                          frame.setSize(
          new Dimension(400300));
                          frame.setUndecorated(
          true);
                          setAtCenter(frame);
                          frame.setVisible(
          true);
                      }
                  });
              }

              
          // 將Window置于屏幕正中
              private static void setAtCenter(Window window) {
                  Dimension screenSize 
          = Toolkit.getDefaultToolkit().getScreenSize();
                  window.setLocation((screenSize.width 
          - window.getWidth()) / 2,
                          (screenSize.height 
          - window.getHeight()) / 2);
              }
          }

          執(zhí)行上述程序的效果如下圖所示,


          2. 創(chuàng)建不規(guī)則窗體
          基于上述程序創(chuàng)建不規(guī)則窗體,使整個(gè)窗體正好缺失掉RIGHT JButton所在的區(qū)域,如下代碼所示,
          public class ShapedFrame extends JFrame {

              
          private static final long serialVersionUID = -2291343874280454383L;

              
          private static Method method = null;

              
          static {
                  
          try {
                      Class
          <?> clazz = Class.forName("com.sun.awt.AWTUtilities");
                      method 
          = clazz.getMethod("setWindowShape", Window.class, Shape.class);
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
              }

              
          private JButton centerButton = new JButton("Center");

              
          public ShapedFrame() {
                  
          super("Shaped Frame");
                  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  initUI();
                  addComponentListener(componentListener);
              }

              
          private void initUI() {
                  Container container 
          = getContentPane();
                  container.setLayout(
          new BorderLayout());

                  container.add(
          new JButton("TOP"), BorderLayout.PAGE_START);
                  container.add(
          new JButton("RIGHT"), BorderLayout.LINE_END);
                  container.add(
          new JButton("BOTTOM"), BorderLayout.PAGE_END);
                  container.add(
          new JButton("LEFT"), BorderLayout.LINE_START);
                  container.add(centerButton, BorderLayout.CENTER);
              }

              
          private ComponentListener componentListener = new ComponentAdapter() {

                  @Override
                  
          public void componentResized(ComponentEvent evt) { // 當(dāng)UI組件(JFrame)的尺寸發(fā)生改變時(shí),調(diào)用該方法
                      Rectangle frameRect = getBounds();
                      Rectangle spaceRect 
          = centerButton.getBounds();

                      Point o1 
          = new Point(00);
                      Point o2 
          = new Point(frameRect.width, 0);
                      Point o3 
          = new Point(frameRect.width, frameRect.height);
                      Point o4 
          = new Point(0, frameRect.height);

                      Point i1 
          = new Point(spaceRect.x + spaceRect.width, spaceRect.y);
                      Point i2 
          = new Point(frameRect.width, spaceRect.y);
                      Point i3 
          = new Point(frameRect.width, spaceRect.y
                              
          + spaceRect.height);
                      Point i4 
          = new Point(spaceRect.x + spaceRect.width, spaceRect.y + spaceRect.height);

                      
          int[] xpoints = new int[] { o1.x, o2.x, i2.x, i1.x, i4.x, i3.x, o3.x, o4.x };
                      
          int[] ypoints = new int[] { o1.y, o2.y, i2.y, i1.y, i4.y, i3.y, o3.y, o4.y };
                      
          int npoints = 8
                      
          // 構(gòu)建一個(gè)六邊形,將RIGHT JButton所處的位置空缺出來
                      Shape shape = new Polygon(xpoints, ypoints, npoints);

                      setWindowShape(ShapedFrame.
          this, shape);
                  }
              };

              
          // 設(shè)置Window的形狀
              private static void setWindowShape(Window window, Shape shape) {
                  
          try {
                      method.invoke(
          null, window, shape);
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
              }

              
          public static void main(String[] args) {
                  SwingUtilities.invokeLater(
          new Runnable() {

                      @Override
                      
          public void run() {
                          ShapedFrame frame 
          = new ShapedFrame();
                          frame.setSize(
          new Dimension(400300));
                          frame.setUndecorated(
          true);
                          setAtCenter(frame);
                          frame.setVisible(
          true);
                      }
                  });
              }

              
          // 將Window置于屏幕正中
              private static void setAtCenter(Window window) {
                  Dimension screenSize 
          = Toolkit.getDefaultToolkit().getScreenSize();
                  window.setLocation((screenSize.width 
          - window.getWidth()) / 2,
                          (screenSize.height 
          - window.getHeight()) / 2);
              }
          }

          執(zhí)行上述程序后,會(huì)有如下圖所示的效果,


          posted on 2011-05-31 20:46 John Jiang 閱讀(1984) 評(píng)論(0)  編輯  收藏 所屬分類: JavaSE 、Java 、SwingGUI 、原創(chuàng)
          主站蜘蛛池模板: 焦作市| 玉田县| 苍山县| 北流市| 郧西县| 五莲县| 周至县| 资兴市| 蒙自县| 通河县| 南安市| 荣昌县| 亚东县| 古蔺县| 都匀市| 兖州市| 苍梧县| 九江县| 长丰县| 馆陶县| 达州市| 惠州市| 阳朔县| 方正县| 安宁市| 永定县| 乌鲁木齐市| 桐柏县| 正镶白旗| 资溪县| 瓮安县| 大化| 醴陵市| 洮南市| 罗山县| 璧山县| 香格里拉县| 太原市| 平泉县| 富锦市| 康保县|