Swing 投影边框

这篇博客介绍了如何在Java Swing应用中创建投影边框的效果。作者分享了一段使用JHLab库实现高斯模糊的代码,并提供了详细的用法示例和截图。JHLab库可以在Maven仓库中找到。
摘要由CSDN通过智能技术生成

很久之前发在百度Java吧,很快被洪水淹没……


http://tieba.baidu.com/p/1977309130



最近想起来要用,稍微整理了一下发在这里算个存档吧。


代码中用到了 JHLab,只用其中的高斯模糊,可以在maven的repository找到: 

http://mvnrepository.com/artifact/com.jhlabs/filters


先上用法示例和截图:




import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.Arrays;

public class ShadowBorderTest extends JPanel {

  public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {

        JFrame frame = new JFrame("Test ShadowBorder");

        frame.setContentPane(new ShadowBorderTest());

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }
    });
  }

  ShadowBorderTest() {

    super(new GridLayout(2, 2, 20, 20));

    super.setBackground(Color.GRAY.brighter());

    JPanel p1 = new JPanel();
    p1.setBorder(BorderFactory.createCompoundBorder(

            ShadowBorder.newInstance(),
            BorderFactory.createLineBorder(Color.WHITE)
    ));

    JPanel p2 = new JPanel();
    p2.setBorder(BorderFactory.createCompoundBorder(

            ShadowBorder.newBuilder().shadowSize(3).center().build(),
            BorderFactory.createLineBorder(Color.WHITE)
    ));

    JPanel p3 = new JPanel();
    p3.setBorder(BorderFactory.createCompoundBorder(

            ShadowBorder.newBuilder().shadowColor(Color.ORANGE).build(),
            BorderFactory.createLineBorder(Color.WHITE)
    ));

    JPanel p4 = new JPanel();
    p4.setBorder(BorderFactory.createCompoundBorder(

            ShadowBorder.newBuilder().shadowAlpha(0.7f).top().build(),
            BorderFactory.createLineBorder(Color.WHITE)
    ));

    Dimension d = new Dimension(150, 150);
    for (JPanel p : Arrays.asList(p1, p2, p3, p4)) {

      p.setPreferredSize(d);
      add(p);
    }

    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
  }
}

然后是 ShadowBorder 类的代码:


/* 
 * Copyright 2012 wuyou (raistlic@gmail.com) 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 * http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 */

import com.jhlabs.image.GaussianFilter;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

/**
 * ShadowBorder is designed to be immutable, so that it can safely cache
 * the "shadow fragments" images, and reuse them for efficiency.
 * 
 * <p/>
 * The shadow fragments images are determined by the size, color, and alpha
 * of the shadow.
 * 
 * <p/>
 * Instance can be retrieved via an overloading {@code newInstance()} method
 * or a {@code ShadowBorder.ObjectFactory} instance, using a "builder design pa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值