我可以想到两种方法.第一种是生成一个表示方形外边缘和圆形内边缘的Shape.

第二种方法是使用AlphaComposite生成掩码结果.

public class TestMask {

public static void main(String[] args) {

new TestMask();

}

public TestMask() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

}

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new MaskedPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class MaskedPane extends JPanel {

public MaskedPane() {

setBackground(Color.RED);

}

@Override

public Dimension getPreferredSize() {

return new Dimension(200, 200);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

BufferedImage outter = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics2D g2d = outter.createGraphics();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setColor(Color.BLACK);

g2d.fillRect(0, 0, getWidth(), getHeight());

g2d.dispose();

BufferedImage inner = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);

g2d = inner.createGraphics();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setColor(Color.BLACK);

g2d.fillRoundRect(10, 10, getWidth() - 20, getHeight() - 20, 20, 20);

g2d.dispose();

BufferedImage masked = applyMask(outter, inner, AlphaComposite.DST_OUT);

g.drawImage(masked, 0, 0, this);

}

public BufferedImage applyMask(BufferedImage sourceImage, BufferedImage maskImage, int method) {

BufferedImage maskedImage = null;

if (sourceImage != null) {

int width = maskImage.getWidth();

int height = maskImage.getHeight();

maskedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

Graphics2D mg = maskedImage.createGraphics();

int x = (width - sourceImage.getWidth()) / 2;

int y = (height - sourceImage.getHeight()) / 2;

mg.drawImage(sourceImage, x, y, null);

mg.setComposite(AlphaComposite.getInstance(method));

mg.drawImage(maskImage, 0, 0, null);

mg.dispose();

}

return maskedImage;

}

public BufferedImage applyMask(BufferedImage sourceImage, BufferedImage maskImage) {

return (BufferedImage) applyMask(sourceImage, maskImage, AlphaComposite.DST_IN);

}

}

}

更新了Shape示例

终于有时间敲出一个……

public class TestMask {

public static void main(String[] args) {

new TestMask();

}

public TestMask() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

}

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new ShapedPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class ShapedPane extends JPanel {

public ShapedPane() {

setBackground(Color.GREEN);

}

@Override

public Dimension getPreferredSize() {

return new Dimension(200, 200);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setColor(Color.BLACK);

g2d.fill(new RounedFrame(getWidth(), getHeight(), 10, 20));

g2d.dispose();

}

}

public class RounedFrame extends Path2D.Float {

public RounedFrame(float width, float height, float thickness, float radius) {

moveTo(0, 0);

lineTo(width, 0);

lineTo(width, height);

lineTo(0, height);

lineTo(0, 0);

float innerWidth = width - thickness;

float innerHeight = height - thickness;

moveTo(thickness + radius, thickness);

lineTo(innerWidth - radius, thickness);

curveTo(innerWidth, thickness, innerWidth, thickness, innerWidth, thickness + radius);

lineTo(innerWidth, innerHeight - radius);

curveTo(innerWidth, innerHeight, innerWidth, innerHeight, innerWidth - radius, innerHeight);

lineTo(thickness + radius, innerHeight);

curveTo(thickness, innerHeight, thickness, innerHeight, thickness, innerHeight - radius);

lineTo(thickness, thickness + radius);

curveTo(thickness, thickness, thickness, thickness, thickness + radius, thickness);

closePath();

setWindingRule(WIND_EVEN_ODD);

}

}

}

更新

根据Andrew的评论,您可以使用Area简化形状示例的使用

您可以使用以下示例替换上面示例中的paintComponent …

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Area area = new Area(new Rectangle(0, 0, getWidth(), getHeight()));

area.subtract(new Area(new RoundRectangle2D.Float(10, 10, getWidth() - 20, getHeight() - 20, 20, 20)));

Graphics2D g2d = (Graphics2D) g.create();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setColor(Color.BLACK);

g2d.fill(area);

g2d.dispose();

}

这更简单:D

java圆角矩形_如何在java中使用普通矩形轮廓绘制圆角矩形相关推荐

  1. java 正则表达式 开头_如何在Java中修复表达式的非法开头

    java 正则表达式 开头 您是否遇到过这个令人难以置信的错误,想知道如何解决它? 让我们仔细阅读一下,研究如何解决表达式Java非法开头错误. 这是一个动态错误,这意味着编译器会发现某些不符合Jav ...

  2. java soap 头_如何在Java中添加Soap标头

    我有一个来自oracle的NO.net Web服务,要访问,我需要添加soap标头.如何在Java中添加soap标头? Authenticator.setDefault(new ProxyAuthen ...

  3. java实现递归算法_如何在Java中实现二进制搜索算法而无需递归

    java实现递归算法 by javinpaul 由javinpaul 流行的二进制搜索算法的迭代实现,用于在排序数组中查找元素. (An Iterative implementation of the ...

  4. java jcombobox长度_如何在JToolBar中设定JComboBox的大小?

    如何在JToolBar中设定JComboBox的大小? 我设计了一个JToolBar,并且在上边添加了一个JComboBox,可是我发现这个JComboBox长度无法控制,它将JToolBar上剩余空 ...

  5. java 全局数组_如何在Java中声明全局数组?

    我有一个程序在Java中乘以两个矩阵.我在全局错误声明中发现了一些错误. 这里是我的代码如何在Java中声明全局数组? import java.util.Scanner; /**WAP in Java ...

  6. java插入图片_如何在java窗体程序中添加图片

    打开eclipse,创建一个java工程项目,创建完后在src下新建一个类Window,由于要插入图片,所以还在工程目录下创建一个文件夹imgs,里面放了一张60*60的图片,创建后的工程目录和图片, ...

  7. java安卓计时器_如何在android中设置计时器

    通过java.util.Timer和java.util.TimerTask使用计时器的标准Java方法在Android中运行良好,但是你应该知道这个方法创建了一个新线程. 您可以考虑使用非常方便的Ha ...

  8. java cpu监控_如何在Java中监视计算机的CPU,内存和磁盘使用情况?

    问题 我想用Java监视以下系统信息: 当前CPU使用率**(百分比) 可用内存*(免费/总计) 可用磁盘空间(空闲/总计)*请注意,我的意思是整个系统可用的总内存,而不仅仅是JVM. 我正在寻找一种 ...

  9. ubuntu java 关闭进程_如何在Ubuntu中关闭Tomcat?

    问题描述 我试图关闭tomcat,如下所示,但是tomcat似乎仍在运行(http://localhost:8080 /) vandegraff@vandegraff-laptop:~$ /usr/s ...

  10. java+script+当前日期_如何在JavaScript中获取当前日期?

    如何在JavaScript中获取当前日期? #1楼 您可以使用扩展了 Date对象的Date.js库,从而可以使用.today()方法. #2楼 如果您想对日期格式进行更多的粒度控制,我强烈建议您查看 ...

最新文章

  1. 用 Qt 给嵌入式Linux加个桌面
  2. 在Jira停售后,你决定赌Atlassian Data Center?
  3. 用express-generator创建express项目骨架
  4. 微软发布了Spartan项目的细节,并证实了某些流言
  5. 前端实现炫酷动效_20个网页动效设计的炫酷神器
  6. 硬核!这所大学包下高铁,接滞留湖北的学生返校!
  7. MySQL 直接存储图片并在 html 页面中展示,点击下载
  8. win7桌面便签。自带的
  9. python自动数据结构_Python 数据结构
  10. SQL中常用的日期函数
  11. 学习电商项目的经验总结(三)
  12. 综合运用(烤地瓜,搬家具)
  13. 双鱼林 android 服务器,双鱼林安卓Android代码生成器下载_双鱼林安卓Android代码生成器官方下载-太平洋下载中心...
  14. Qt读取/写入Excel数据--QAxObject
  15. IPhone、Windows Mobil、Symbian、Android移动开发前景分析
  16. php抓取网页上的指定内容
  17. Hadoop HA (四) --------- YARN-HA 配置
  18. [XJTU计算机网络安全与管理]——第十三讲 攻击与病毒
  19. 小米9支持Android11吗,适用于小米9 Lite的MIUI 11和Android 10已到达
  20. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统

热门文章

  1. Spring Boot 2.2.1 正式发布,需特别注意这个注解的使用!
  2. 阿里程序员推荐的15 款常用开发者工具
  3. android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...
  4. JAVA静态方法是否可以被继承 6,JAVA静态方法是否可以被继承?
  5. html不支持png%3e,关于Adobe Flash CS3无法导入png格式图片的修复方法(真正解决问题)...
  6. 轻量级人脸属性Slim-CNN
  7. opencv去除图片的高光
  8. unable to get repr for class ‘torch.tensor‘
  9. android Camera2
  10. HP 打印机驱动安装Return code:1603解决办法