Swinghacks——抗锯齿字体

先看看对比图片


上面的是普通字体,下面的是抗锯齿字体,多少还是有点区别的

设置方法很简单:

        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

很不幸的是,Graphics是一个短生命周期的类,因为下一次paint执行的时候,Graphics会被new,它并不是单例

当然你可以重写paintComponent方法,像这样

    public void paintComponent(Graphics g){
    	Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        super.paintComponent(g2);
    }
这样可以很好的保证组件在画自己的时候,使用抗锯齿字体

但这样一来,你就要重写所有控件的paintComponent,也就意味着要新建所有的subclass

然后再想想别的办法,我们重新看看paint方法,所有控件都是paint方法画出来的,paint分为3个步骤paintComponent , paintBorder , paintChildren顺序执行

所以我们想重画组件是重写paintComponent方法而不是paint,当然除非你想试着重写下paint

paintChildren可能让你眼前一亮,因为调用子控件的绘制之前会调用容器的paintChildren,而且子控件的paint(g)参数是使用父控件的paintChildren(g)参数

那么把最顶层容器的paintChildren重写就可以了

是的,确实这样分析是没问题的,只是,这样只能起到一次效果

swing做过很多优化,当界面中有脏区域的时候,swing并不是刷新所有的控件,而是尽可能少的刷新控件。所以并不是每次,swing都从最顶层容器的paint方法开始执行刷新。

这样会有什么问题呢,假如你重写了顶层容器的paintChildren,那窗口显示之后,所有字体都是抗锯齿字体,这没有问题。

加入此时再动态往容器中某个位置新增一个控件,好吧,swing就刷新那一小部分需要刷新的区域,Graphics被new,而顶层容器的paint没有执行

当然有一个解决方法,不过并不是很合适,仅供学习参考吧

RepaintManager类有一个方法addDirtyRegion,用来设置屏幕的脏区域,然后那块区域会被刷新

我们可以重写addDirtyRegion方法,每当addDirtyRegion执行时,就把整个界面都加入到脏区域中,这样就会刷新整个界面,也就会执行到顶层容器的paint

当然为了这个字体做这么大的牺牲,从效率角度考虑还是不值得的,不过通过此例学习下RepaintManager也不错

上代码:

import javax.swing.RepaintManager;
import javax.swing.JComponent;
import java.awt.Container;

public class FullRepaintManager extends RepaintManager {
    public void addDirtyRegion(JComponent comp, int x, int y, int w, int h) {
        super.addDirtyRegion(comp,x,y,w,h);
        JComponent root = getRootJComponent(comp);
        // to avoid a recursive infinite loop
        if(comp != root) {
            super.addDirtyRegion(root,0,0,root.getWidth(),root.getHeight());
        }
    }
    public JComponent getRootJComponent(JComponent comp) {
        Container parent = comp.getParent();
        if(parent instanceof JComponent) {
            return getRootJComponent((JComponent)parent);
        }
        return comp;
    }

}




Java编程语言一般是和重要的企业级应用程序联系在一起的,运行它们的服务器可能主位于蒙大拿的某个冰冷的机房里。不过,是桌面应用催生了Java,未来也必将是桌面应让Java能更加光彩夺目。通过AWT和现在的Swing,Java为编写图形化用户界面提供了丰富的客户端API。不过想要让Java、AWT和Swing达到最佳性能并不容易(也不方便),特别是在模拟交互式Web站点或像Windows XP和Mac OS X这样的操作系统外观时更是如此。\r\n 本书能帮助JAVA开发人员跳过Swing的基础节直接让桌面应用程序贴近现实。如果读者是一个Java开人员,并想开发带有一流外观的企业级应用程序,那就应该掌握Swing。不过对Swing的hack并不仅仅局限于对它的正常使用,而是关于一些读者或许要经过多年才能领会到的技巧。它们是一些富有创造性的、原创的甚至是诡异的hack,能让读者发出由衷的惊叹:“我可没想过居然能用Swing干这个!”\r\n 在本书中,读者将学到:\r\n 过滤不用的列表控件,对用户的输入做出合适的反应;\r\n 为列表和组合框组件提供拖放功能;\r\n 在图形组件之间实现动态效果,并能创建动态列表式界面;\r\n 控制任何方面,从鼠标指针到光标,乃至闪动键盘灯;\r\n 在Swing中构建分层、覆盖组件并灵活使用透明窗格屏蔽Swing接口内部的复杂细节和伸缩性。 ================================== 对学习SWING很有帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值