Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 715|回复: 0

[Swing学习]自定义圆型布局管理器

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-13 23:59:47 | 显示全部楼层 |阅读模式
    自定义一个布局管理器


       
      
       
       

         
       

         
       
      

    1. import java.awt.BorderLayout;  
    2. import java.awt.EventQueue;  
    3. import javax.swing.JButton;  
    4. import javax.swing.JFrame;  
    5. import javax.swing.JPanel;  
    6. import javax.swing.border.EmptyBorder;  
    7. /**  
    8.   * mxcyk.com  
    9.   * @author k  
    10.   *  
    11.   */
    12. public class CircleLayoutTest extends JFrame {  
    13.    
    14.    
    15.      private static final long serialVersionUID = 3479036492186972580L;  
    16.     private JPanel contentPane;  
    17.    
    18.     public static void main(String[] args) {  
    19.          EventQueue.invokeLater(new Runnable() {  
    20.              public void run() {  
    21.                 try {  
    22.                      CircleLayoutTest frame = new CircleLayoutTest();  
    23.                      frame.setVisible(true);  
    24.                  } catch (Exception e) {  
    25.                      e.printStackTrace();  
    26.                  }  
    27.              }  
    28.          });  
    29.      }  
    30.    
    31.      /**  
    32.       * Create the frame.  
    33.       */
    34.      public CircleLayoutTest() {  
    35.          setTitle("mxcyk.com自定义圆形布局");  
    36.          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    37.          setBounds(100, 100, 450, 300);  
    38.          contentPane = new JPanel();  
    39.          contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));  
    40.          contentPane.setLayout(new BorderLayout(0, 0));  
    41.          setContentPane(contentPane);  
    42.          setLayout(new CircleLayout());  
    43.          for (int i = 0; i < 12; i++) {  
    44.              if (i < 10) {  
    45.                  add(new JButton("0" + i));  
    46.              } else {  
    47.                  add(new JButton("" + i));  
    48.              }  
    49.          }  
    50.      }  
    51.    
    52. }  

    53. import java.awt.Component;
    54. import java.awt.Container;
    55. import java.awt.Dimension;
    56. import java.awt.Insets;
    57. import java.awt.LayoutManager;
    58. public class CircleLayout implements LayoutManager {
    59.     @Override
    60.     public void addLayoutComponent(String name, Component comp) {
    61.     }
    62.     @Override
    63.     public void layoutContainer(Container parent) {
    64.         double centerX = parent.getBounds().getCenterX();// 获得容器中心的X坐标
    65.         double centerY = parent.getBounds().getCenterY();// 获得容器中心的Y坐标
    66.         Insets insets = parent.getInsets();// 获得容器默认边框对象
    67.         double horizon = centerX - insets.left;// 获得水平可用长度的一半
    68.         double vertical = centerY - insets.top;// 获得垂直可用长度的一半
    69.         double radius = horizon > vertical ? vertical : horizon;// 取小的为圆形半径
    70.         int count = parent.getComponentCount();// 获得容器中控件的个数
    71.         for (int i = 0; i < count; i++) {// 依次设置所有可见控件的位置和大小
    72.             Component component = parent.getComponent(i);
    73.             if (component.isVisible()) {
    74.                 Dimension size = component.getPreferredSize();// 大小使用其最佳大小
    75.                 double angle = 2 * Math.PI * i / count;// 获得角度的大小
    76.                 double x = centerX + radius * Math.sin(angle);// 获得圆周点的X坐标
    77.                 double y = centerY - radius * Math.cos(angle);// 获得圆周点的Y坐标
    78.                 component.setBounds((int) x - size.width / 2,
    79.                    (int) y - size.height / 2, size.width, size.height);// 重新设置控件的位置和大小
    80.             }
    81.         }
    82.     }
    83.     @Override
    84.     public Dimension minimumLayoutSize(Container parent) {
    85.         return parent.getMinimumSize();
    86.     }
    87.     @Override
    88.     public Dimension preferredLayoutSize(Container parent) {
    89.         return parent.getPreferredSize();
    90.     }
    91.     @Override
    92.     public void removeLayoutComponent(Component comp) {
    93.     }
    94. }
    复制代码


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/13/235946906.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:44 , Processed in 0.328666 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表