/*
* 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.
*/
package soft.edu.ui;
import com.jhlabs.image.GaussianFilter;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* Instance can be retrieved via an overloading {@code newInstance()} method
* or a {@code ShadowBorder.Builder} instance, using a "builder design pattern".
*
* It is recommended that the component to apply this border is NOT opaque(in
* the sense of Swing painting hierarchy), because the "shadow border effect"
* itself implies a somewhat "transparent" effect. In the case of being applied
* to an opaque component, this class tries to use an expensive reflection hack
* to "erase" the border area before painting the border, which is not fully
* tested and can be dangerous.
*
* This class uses a third-party graphics library to draw the "gaussian blur"
* effect.
*
* The dependency jar can be downloaded from the JHLabs website, or from
* the maven central repository with the following POM coordination:
*
* <pre>{@code
*
* <groupId>com.jhlabs</groupId>
* <artifactId>filters</artifactId>
* <packaging>jar</packaging>
* <version>2.0.235</version>
* <name>JHLabs Image Processing Filters</name>
* <description>A collection of image processing filters.</description>
* <url>http://www.jhlabs.com/ip/index.html</url>
*
* }</pre>
*
* @author raistlic
* @date Nov 10, 2012
*/
public class ShadowBorder implements Border {
public static final int DEFAULT_SIZE = 4;
public static final Color DEFAULT_COLOR = Color.BLACK;
public static final float DEFAULT_ALPHA = 0.5f;
private static final float DEFAULT_PADDING_TOP = 0.0f;
private static final float DEFAULT_PADDING_LEFT = 0.0f;
public static ShadowBorder newInstance() {
return newInstance(DEFAULT_SIZE, DEFAULT_COLOR, DEFAULT_ALPHA);
}
public static ShadowBorder newInstance(int size) {
return newInstance(size, DEFAULT_COLOR, DEFAULT_ALPHA);
}
public static ShadowBorder newInstance(int size, Color c) {
return newInstance(size, c, DEFAULT_ALPHA);
}
public static ShadowBorder newInstance(int size, Color c, float alpha) {
size = Math.max(size, 0);
alpha = Math.max(alpha, 0f);
alpha = Math.min(alpha, 1f);
if( c == null )
c = DEFAULT_COLOR;
return newInstance(size, c, alpha, DEFAULT_PADDING_TOP, DEFAULT_PADDING_LEFT);
}
public static ShadowBorder newInstance(int size, Color c, float alpha,
float paddingLeft, float paddingTop) {
size = Math.max(size, 0);
alpha = Math.max(alpha, 0f);
alpha = Math.min(alpha, 1f);
paddingLeft = Math.max(paddingLeft, 0f);
paddingLeft = Math.min(paddingLeft, 1f);
paddingTop = Math.max(paddingTop, 0f);
paddingTop = Math.min(paddingTop, 1f);
if( c == null )
c = DEFAULT_COLOR;
return new ShadowBorder(size, c, alpha, paddingLeft, paddingTop);
}
public static Builder newBuilder() {
return new Builder();
}
public static class Builder {
private int size = DEFAULT_SIZE;
private Color color = DEFAULT_COLOR;
private float alpha = DEFAULT_ALPHA;
private float paddingLeft = DEFAULT_PADDING_LEFT;
private float paddingTop = DEFAULT_PADDING_TOP;
// use static method ShadowBorder.newBuilder().
private Builder() {}
public Builder shadowSize(int size) {
if( size < 0 )
throw new IllegalArgumentException("Invalid shadow size: " + size);
this.size = size;
return this;
}
public Builder shadowColor(Color color) {
if( color == null )
throw new NullPointerException();
this.color = color;
return this;
}
public Builder shadowAlpha(float alpha) {
alpha = Math.max(alpha, 0f);
alpha = Math.min(alpha, 1f);
this.alpha = alpha;
return this;
}
public Builder paddingLeft(float paddingLeft) {
paddingLeft = Math.max(paddingLeft, 0f);
paddingLeft = Math.min(paddingLeft, 1f);
this.paddingLeft = paddingLeft;
return this;
}
public Builder paddingTop(float paddingTop) {
paddingTop = Math.max(paddingTop, 0f);
paddingTop = Math.min(paddingTop, 1f);
this.paddingTop = paddingTop;
return this;
}
public Builder topLeft() {
return paddingLeft(0f).paddingTop(0f);
}
public Builder left() {
return paddingLeft(0f).paddingTop(0.5f);
}
public Builder bottomLeft() {
return paddingLeft(0f).paddingTop(1f);
}
public Builder bottom() {
return paddingLeft(0.5f).paddingTop(1f);
}
public Builder bottomRight() {
return paddingLeft(1f).paddingTop(1f);
}
public Builder right() {
return paddingLeft(1f).paddingTop(0.5f);
}
public Builder topRight() {
return paddingLeft(1f).paddingTop(0f);
}
public Builder top() {
return paddingLeft(0.5f).paddingTop(0f);
}
public Builder center() {
return paddingLeft(0.5f).paddingTop(0.5f);
}
public ShadowBorder build() {
return new ShadowBorder(size, color, alpha,
paddingLeft, paddingTop);
}
}
private BufferedImage[] shadows;
private final int size;
private final Color color;
private final float alpha;
private final Insets insetsMax, insetsActual;
private ShadowBorder(int size, Color color, float alpha,
float paddingLeft, float paddingTop) {
assert size > 0;
assert color != null;
assert alpha > 0f;
assert alpha <= 1f;
assert paddingLeft >= 0f;
assert paddingLeft <= 1f;
assert paddingTop <= 0f;
assert paddingTop >= 1f;
this.size = size;
this.color = color;
this.alpha = alpha;
int dsize = size * 2;
insetsMax = new Insets(dsize, dsize, dsize, dsize);
insetsActual = new Insets(0, 0, 0, 0);
insetsActual.left = Math.max(0, Math.min(dsize, Math.round(dsize * paddingLeft)));
insetsActual.top = Math.max(0, Math.min(dsize, Math.round(dsize * paddingTop)));
insetsActual.right = dsize - insetsActual.left;
insetsActual.bottom = dsize - insetsActual.top;
}
@Override
@SuppressWarnings("unchecked")
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
Rectangle bounds = new Rectangle(x, y, width, height);
@SuppressWarnings("unchecked")
Graphics2D gg = (Graphics2D)g.create();
Insets insets = getBorderInsets(c);
Area shadowArea = new Area(bounds);
shadowArea.subtract( new Area( new Rectangle(
bounds.x + insets.left,
bounds.y + insets.top,
bounds.width - insets.left - insets.right,
bounds.height - insets.top - insets.bottom
)));
gg.setClip(shadowArea);
// expensive hack =)
if( c.isOpaque() )
hackOpaque(c, gg, bounds);
for(Edge edge : Edge.values()) {
edge.fil
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java学生考勤管理系统.zip (90个子文件)
java_cs_stuAttendanceSys
src
main
resources
images
Fingerprint.png 1KB
update.png 1KB
panel_background.jpg 56KB
error.png 1KB
pre.png 3KB
TeacherLogin.png 17KB
mousepress_button.png 2KB
check.png 2KB
refresh.png 1KB
teacher.png 3KB
panel_bg1.jpg 335KB
frame_bg.jpg 304KB
pwd.png 1KB
delete.png 864B
frametitle.png 2KB
mousemoveon_button.png 2KB
student.png 3KB
default_button.png 2KB
StudentLogin.png 12KB
Logout.png 2KB
bg.jpg 177KB
next.png 3KB
Portrait.png 4KB
panel_img1.jpg 45KB
photos
e10b9e74-3e49-4602-9aed-5cb5bdba0045.png 1KB
454058d0-e85c-471a-8db4-45539e309d4f.png 17KB
babef46f-3327-4d82-be71-407339516583.png 12KB
cd39c439-922b-400b-80fd-5ca08eae2ce0.png 12KB
65ebe9c3-77c1-4c8e-83b7-edc7aacce921.png 17KB
beaefd16-7d6c-4ca6-a024-8a50c1c13cdb.png 3KB
java
soft
edu
view
TechListStuFrame.java 9KB
StuLoginFrame.java 5KB
StuInfoFrame.java 3KB
ShowStuDetailFrame.java 98B
MainLoginFrame.java 3KB
AddAttRecordFrame.java 4KB
ListTecInfoFrame.java 1KB
ListStuClassFrame.java 1KB
TechMainFrame.java 15KB
TechInfoFrame.java 3KB
StuMainFrame.java 7KB
TecLoginFrame.java 5KB
UpdatePwdFrame.java 4KB
UpdateInfoFrame.java 9KB
dao
ITeacherDao.java 449B
IStuDao.java 519B
RecordDaoImpl.java 11KB
CollegeDaoImpl.java 1KB
FacultyDaoImpl.java 1KB
StuDaoImpl.java 4KB
ICollegeDao.java 162B
IRecordDao.java 494B
ClassDaoImpl.java 3KB
IClassDao.java 281B
TeacherDaoImpl.java 3KB
IFacultyDao.java 186B
SelectCourseDaoImpl.java 1KB
domain
FacultyBean.java 813B
CollegeBean.java 813B
ClassBean.java 1KB
AttendanceBean.java 807B
StudentBean.java 1KB
TeacherBean.java 1KB
SelectcourseBean.java 614B
ui
UpdateTableCellRenderer.java 1KB
DetailInfoPanel.java 2KB
DeleteTableCellRenderer.java 1KB
DateCellEditor.java 11KB
RoundRectButton.java 3KB
ListInfoPanel.java 1KB
ShadowBorder.java 18KB
DateChooser.java 16KB
TechListTableCellRenderer.java 2KB
util
RegexUtil.java 507B
PanelUtil.java 514B
ImageIconUtil.java 883B
FileUtil.java 827B
FrameUtil.java 1KB
common
BackgroundImageFrame.java 102B
DatabaseConnection.java 2KB
BaseEntity.java 118B
BaseDao.java 10KB
BackgroundImagePanel.java 948B
SoftConfig.java 2KB
PageBean.java 2KB
screenshots
QQ截图20190428211021.png 172KB
QQ截图20190428211004.png 167KB
QQ截图20190428210925.png 130KB
pom.xml 2KB
stuattendance.sql 34KB
共 90 条
- 1
资源评论
君若雅
- 粉丝: 405
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 【代码】RT1021-100P MicroPython固件使用例程.7z
- springboot176基于Spring Boot的装饰工程管理系统.rar
- springboot171社区医院管理系统.rar
- 1251+1255.pdf
- springboot169基于vue的工厂车间管理系统的设计.rar
- springboot168基于springboot + vue的疫情隔离管理系统.rar
- 高校人事管理系统.zip
- ACM比赛算法:ACM 树同构-比赛常用的算法
- Python课程大作业二手车价格预测案例数据挖掘源码+数据集+实验报告+详细注释.zip
- springboot167基于springboot的医院后台管理系统的设计与实现.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功