简介

实现LayoutManager 接口即可,只要实现5个接口杰克

分别是

void addLayoutComponent(String s, Component c);

void removeLayoutComponent(Component c);

Dimension perferredLayoutSize(Container parent);

Dimension minimumLayoutSize(Container parent);

void layoutContainer(Container parent);

java 核心编程带来了 如下的circleLayout

code

/*
* @Author: your name
* @Date: 2020-11-08 13:51:10
* @LastEditTime: 2020-11-08 13:54:40
* @LastEditors: your name
* @Description: In User Settings Edit
* @FilePath: /java/circleLayout/CircleLayout.java
*/
package circleLayout; import java.awt.*; /**
* A layout manager that lays out components along a circle.
*/
public class CircleLayout implements LayoutManager {
private int minWidth = 0;
private int minHeight = 0;
private int preferredWidth = 0;
private int preferredHeight = 0;
private boolean sizesSet = false;
private int maxComponentWidth = 0;
private int maxComponentHeight = 0; public void addLayoutComponent(String name, Component comp) {
} public void removeLayoutComponent(Component comp) {
} public void setSizes(Container parent) {
if (sizesSet)
return;
int n = parent.getComponentCount(); preferredWidth = 0;
preferredHeight = 0;
minWidth = 0;
minHeight = 0;
maxComponentWidth = 0;
maxComponentHeight = 0; // compute the maximum component widths and heights
// and set the preferred size to the sum of the component sizes
for (int i = 0; i < n; i++) {
Component c = parent.getComponent(i);
if (c.isVisible()) {
Dimension d = c.getPreferredSize();
maxComponentWidth = Math.max(maxComponentWidth, d.width);
maxComponentHeight = Math.max(maxComponentHeight, d.height);
preferredWidth += d.width;
preferredHeight += d.height;
}
}
minWidth = preferredWidth / 2;
minHeight = preferredHeight / 2;
sizesSet = true;
} public Dimension preferredLayoutSize(Container parent) {
setSizes(parent);
Insets insets = parent.getInsets();
int width = preferredWidth + insets.left + insets.right;
int height = preferredHeight + insets.top + insets.bottom;
return new Dimension(width, height);
} public Dimension minimumLayoutSize(Container parent) {
setSizes(parent);
Insets insets = parent.getInsets();
int width = minWidth + insets.left + insets.right;
int height = minHeight + insets.top + insets.bottom;
return new Dimension(width, height);
} public void layoutContainer(Container parent) {
setSizes(parent); // compute center of the circle Insets insets = parent.getInsets();
int containerWidth = parent.getSize().width - insets.left - insets.right;
int containerHeight = parent.getSize().height - insets.top - insets.bottom; int xcenter = insets.left + containerWidth / 2;
int ycenter = insets.top + containerHeight / 2; // compute radius of the circle int xradius = (containerWidth - maxComponentWidth) / 2;
int yradius = (containerHeight - maxComponentHeight) / 2;
int radius = Math.min(xradius, yradius); // lay out components along the circle int n = parent.getComponentCount();
for (int i = 0; i < n; i++) {
Component c = parent.getComponent(i);
if (c.isVisible()) {
double angle = 2 * Math.PI * i / n; // center point of component
int x = xcenter + (int) (Math.cos(angle) * radius);
int y = ycenter + (int) (Math.sin(angle) * radius); // move component so that its center is (x, y)
// and its size is its preferred size
Dimension d = c.getPreferredSize();
c.setBounds(x - d.width / 2, y - d.height / 2, d.width, d.height);
}
}
}
}
/*
* @Author: your name
* @Date: 2020-11-08 13:51:10
* @LastEditTime: 2020-11-08 13:51:37
* @LastEditors: your name
* @Description: In User Settings Edit
* @FilePath: /java/circleLayout/CircleLayoutFrame.java
*/
package circleLayout; import javax.swing.*; /**
* A frame that shows buttons arranged along a circle.
*/
public class CircleLayoutFrame extends JFrame {
public CircleLayoutFrame() {
setLayout(new CircleLayout());
add(new JButton("Yellow"));
add(new JButton("Blue"));
add(new JButton("Red"));
add(new JButton("Green"));
add(new JButton("Orange"));
add(new JButton("Fuchsia"));
add(new JButton("Indigo"));
pack();
}
}
package circleLayout;

import java.awt.*;
import javax.swing.*; /**
* @version 1.34 2018-04-10
* @author Cay Horstmann
*/
public class CircleLayoutTest {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
var frame = new CircleLayoutFrame();
frame.setTitle("CircleLayoutTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}

java 实现自定义框架的更多相关文章

  1. Robot Framework自动化测试框架核心指南-如何使用Java编写自定义的RobotFramework Lib

    如何使用Java编写自定义的RobotFramework Lib 本文包括2个章节 1. Robot Frdamwork中如何调用java Lib库 2.使用 java编写自定义的Lib 本文作者为: ...

  2. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

  3. 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)

    1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar.log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的 ...

  4. 自定义框架(MyMvc)

    //初次接触自定义框架,简单的登录功能的实现流程:: 当我们实现登录功能的时候,首先会创建一个login.jsp 会写这些登录表单 <form action="loginAction. ...

  5. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  6. 我的自定义框架 || 基于Spring Boot || 第一步

    今天在园子里面看到一位大神写的springboot做的框架,感觉挺不错,遂想起来自己还没有一个属于自己的框架,决定先将大神做好的拿过来,然后加入自己觉得需要的模块,不断完善 目前直接复制粘贴过来的,后 ...

  7. 5个强大的Java分布式缓存框架

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了5 ...

  8. Java基于ssm框架的restful应用开发

    Java基于ssm框架的restful应用开发 好几年都没写过java的应用了,这里记录下使用java ssm框架.jwt如何进行rest应用开发,文中会涉及到全局异常拦截处理.jwt校验.token ...

  9. Java Junit测试框架

    Java    Junit测试框架 1.相关概念 Ø JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要 ...

  10. Java后台处理框架之struts2学习总结

    Java后台处理框架之struts2学习总结 最近我在网上了解到,在实际的开发项目中struts2的使用率在不断降低,取而代之的是springMVC.可能有很多的朋友看到这里就会说,那还不如不学str ...

随机推荐

  1. GPFS并行文件系统部署实践

    环境 ubuntu22.04 试用版下载链接 https://www.ibm.com/cn-zh/products/storage-scale 我的版本:Storage_Scale_Developer ...

  2. win mysql实现主从同步(精简版)

    最近项目要弄读写分离,那首先要实现主从同步啊,网上教程很多,但大多都看得云里雾里,so,有了这个精简版: 主库my.ini添加配置: #数据库ID号, 为1时表示为Master,其中master_id ...

  3. Web前端开发规范手册(有点老,仅供参考)

    一.规范目的 1.1 概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本 ...

  4. 题解:CF1433D Districts Connection

    一道简单构造题,一次性 AC. 一种想法是将所有值一样的点全部连到同一个不同值的点上,这样就是所有同一种值的点都有同一个父亲,即可避免连在一起的问题,无解的情况就是只有一种值. 时间复杂度 O(n2) ...

  5. 如何用JavaScript纯前端来实现下载脚本

    1.javascript脚本 function downloadFile(data, fileName, type="text/plain") { // 创建不可见的元素 cons ...

  6. 夸克浏览器PC端功能体验

    一.下载安装 可以看到目前PC端仅仅支持windows,不支持Mac和Linux. 二.功能介绍 夸克浏览器果然很简洁.清新,左侧栏提供首页.网盘.工具.快传四个选项,中间是搜索栏,底部是可定制的天气 ...

  7. 网络编程:TCP故障模式

    故障模式总结 异常情况可归结为两大类: 第一类,是对端无FIN包发送出来的情况:第二类是对端有FIN包发出来 对端无FIN包发送出 网络终端造成对端无FIN包 很多原因都会造成网络中断,这种情况,TC ...

  8. RPC的通信流程

    核心原理:能否画张图解释下RPC的通信流程? RPC的全称是Remote Procedure Call,即远程过程调用.RPC帮助我们屏蔽网络编程细节,实现调用远程方法跟调用本地(同一个项目中的方法) ...

  9. Visual Studio 2019 + GLFW + GLAD

    !!!如果文件正常引入,但依然各种报错找不到C++源文件,可能是版本问题 即现在是x64,调成x32,以及glfw建议下载32版本 参考文章:https://blog.csdn.net/zjz520y ...

  10. odoo15接口调用qweb打印,将pdf旋转并下载到本地

    一.将pdf旋转的通用方法 def rotate_pdf(self, pdf, angle): """ rotateClockwise(90) 这里的pdf传:bytes ...