Java中Synth外观学习(四)--定制JPanel的背景,自定义绘制

Synth外观中可以自定义托管的绘制类。

        在项目中新建如下类,绘制一直渐变的背景和一条曲线:

package demo;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.CubicCurve2D;

import javax.swing.UIManager;
import javax.swing.plaf.synth.SynthContext;
import javax.swing.plaf.synth.SynthPainter;

public class PanelBackgroundPainter extends SynthPainter {

    @Override
    public void paintPanelBackground(SynthContext context, Graphics g,
            int x, int y, int w, int h) {
        Color start = UIManager.getColor("Panel.startBackground");
        Color end = UIManager.getColor("Panel.endBackground");
        Graphics2D g2 = (Graphics2D) g;

        GradientPaint grPaint = new GradientPaint(
                (float) x, (float) y, start, 1, h, end);
        
        g2.setPaint(grPaint);
        g2.fillRect(x, y, w, h);
        g2.setPaint(null);
        
        g2.setColor(new Color(255, 255, 255, 120));
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        CubicCurve2D.Double arc2d = new CubicCurve2D.Double(0, h / 4, w / 3, h / 10, .66 * w, 1.5 * h, w, h / 8);
        g2.draw(arc2d);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
    }
}

XML中按照如下定义:

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->


<synth>
    <style id="panel">  
        <object id="background" class="demo.PanelBackgroundPainter"/>
        <object class="javax.swing.plaf.ColorUIResource" id="startColor">
            <int>30</int>
            <int>123</int>
            <int>235</int>
        </object>
        <defaultsProperty key="Panel.startBackground" type="idref" value="startColor"/>
        <object class="javax.swing.plaf.ColorUIResource" id="endColor">
            <int>1</int>
            <int>20</int>
            <int>80</int>
        </object>
        <defaultsProperty key="Panel.endBackground" type="idref" value="endColor"/>
        <painter method="panelBackground" idref="background"/>
    </style>
    <bind style="panel" type="region" key="Panel"/>
</synth>

效果图如下:



实际上按照如上方式,你可以定义更多的参数,比如渐变步长,是否循环,渐变方向等。在自定义类中可以可以自定义更多的动作,比如水印等其他更多内容。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值