最近闲来无事, 学习学习swing。
在查看JPopMenu的代码时候突发奇想, 想实现一个环形的弹出菜单,说干就干。
我们都知道, swing 组件的位置和大小是由于layout 管理的,所以想实现环形的弹出菜单就必须实现一个环形的布局管理器。请看我的实现
效果
package info.mikewang.gui.layout;
import static java.lang.Math.PI;
import static java.lang.Math.round;
import static java.lang.Math.sin;
import static java.lang.Math.cos;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.Rectangle;
public class CircleLayout implements LayoutManager {
int maxCompWidth = 0; // 最大组件宽度
int maxCompHeight = 0; // 最大组件高度
int lc = 0; // 组件数(边的个数,即多边形边的个数)
double v = 1.5D; // 缩放因子
double cd = 0; // 组件和组件之间的距离(中心点到中心点)
int l; // 外截正方形边长/2
int lw = 0; // 调整过的边长
int lh = 0;
@Override
public void addLayoutComponent(String name, Component comp) {
}
@Override
public void layoutContainer(Container parent) {
synchronized (parent.getTreeLock()) {
Dimension d = parent.getPreferredSize();
Point cp = new Point(d.width / 2, d.height / 2);
double dx = 0, dy = 0;
int cpx = 0, cpy = 0;
for (int i = 0; i < lc; i++) {
// 下面两行的代码要是看不懂的话,就去翻翻初中2年纪的几何书吧
dx = sin(i * (2 * PI / lc)) * l;
dy = -cos(i * (2 * PI / lc)) * l;
cpx = (int) (cp.x + dx);
cpy = (int) (cp.y + dy);
Point cpp = new Point(cpx, cpy);
Component comp = parent.getComponent(i);
Dimension compSize = comp.getPreferredSize();
comp.setBounds(calcR(cpp, compSize));
}
}
}
@Override
public Dimension minimumLayoutSize(Container parent) {
lc = parent.getComponentCount();
Component[] components = parent.getComponents();
for (Component component : components) {
Dimension d = component.getPreferredSize();
if (d.width > this.maxCompWidth) {
this.maxCompWidth = d.width;
}
if (d.height > this.maxCompHeight) {
this.maxCompHeight = d.height;
}
}
calc();
return new Dimension(lw, lh);
}
@Override
public Dimension preferredLayoutSize(Container parent) {
return minimumLayoutSize(parent);
}
@Override
public void removeLayoutComponent(Component comp) {
}
private void calc() {
cd = maxCompWidth * v;
// 根据正多边形的一条边长,计算出这个多边形外切圆形的外切矩形的边长(近似值)
// 使用正弦定理,
double x = cd / sin(2 * PI / lc);
l = (int) round(x);
lh = 2 * l + maxCompHeight;
lw = 2 * l + maxCompWidth;
}
private Rectangle calcR(Point p, Dimension d) {
int y = p.y - d.height / 2;
int x = p.x - d.width / 2;
return new Rectangle(new Point(x, y), d);
}
}
环形 弹出菜单实现
package info.mikewang.gui.layout;
import javax.swing.JPopupMenu;
public class CirclePopupMenu extends JPopupMenu {
private static final long serialVersionUID = 7318307166817760768L;
public CirclePopupMenu() {
this.setLayout(new CircleLayout());
}
}
有个问题, 顺便在这里问一下:
如何才能把弹出窗口的背景设置成透明呀??
- 大小: 18.5 KB
分享到:
相关推荐
jquery环形菜单制作点击弹出图标环形菜单代码 jquery环形菜单制作点击弹出图标环形菜单代码 jquery环形菜单制作点击弹出图标环形菜单代码 jquery环形菜单制作点击弹出图标环形菜单代码 jquery环形菜单制作点击弹出...
点击分享,环形弹出菜单和直接弹出菜单,包括js css img等
html5+jQuery实现的环形按钮菜单点击弹出弹性图标菜单特效源码.zip
jquery点击弹出图标环形菜单代码是一款jquery环形菜单特效代码。
android源码 弹出弧形菜单 android studio环境可直接运行
css3旋转的环形菜单动画特效 css3旋转的环形菜单动画特效
一个别致的环形菜单.zip,精致、别致,支持定制圆形菜单
基于java swing 开发的文件管理器: 采用苹果 ios 主题风格,支持环形进度条显示cpu利用率 GUI文件管理系统 1、实现文件夹创建、删除、进入。 2、实现当前文件夹下的内容罗列。 3、实现文件拷贝和文件夹拷贝...
在WPF中制作环形菜单控件
stm32 串口+DMA+环形FIFO缓存收发数基本例程, 仅供参考 freertos环境,其他环境类推
WPF环形布局
支持定制菜单展开半径、递增角度、起始角度和大小等 说明文章:https://www.cnblogs.com/swarmbees/p/16837670.html
很漂亮的环形菜单,WPF控件Code
jquery实现点击弹出图标环形菜单特效源码.zip
一、功能介绍一个非常美观强大的环形自定义菜单。 右键可添加多级菜单,设置图标以及移除项。 添加好的菜单会自动保存到配置文件里面。该源码仅供学习交流使用。 二、目录介绍1、background目录:存放着32个皮肤...
非常漂亮的环形菜单代码,需要的朋友拿去。
环形菜单
安卓环形菜单的实现,对应博客讲解:http://blog.csdn.net/xuejiawei123/article/details/49280617
jQuery css3右键菜单,K社游戏风格。旋转弹出收回菜单,有菜单弹出音效,弹出有遮罩层,支持移动端。(不兼容IE6,7,8)