(swing读书笔记)Swing Look And Feel(4)

 

(swing读书笔记)Swing Look And Feel(4)

                                                               By cszhao1980

八.MetalLookAndFeel的功能增强

Swing对它默认的跨平台L&F提供了功能的增强,即主题(theme)和客户属性(client property)。利用这两种特性,我们可以对L&F进行定制。这其实很容易理解——既然其他L&F的主要目的是为了模拟native样式,我们只需要它像native样式即可,没有必要提供其他定制的方法。

 

从头制作一套L&F是个复杂的任务,为了简化这一工作,Swing提供了对Metal L&F的这一简便定制方法。

 

客户属性比较容易理解,它是可以在运行时刻添加在L&F上的“键/值”对,如:

     myComponent.putClientProperty("JTree.lineStyle", "Angled")

通过设置这些属性,可以定制metal L&F的样式,常用的客户属性有:

Component

Property

Data type

Default

Other values

JInternalFrame

isPalette

Boolean

false

true

JScrollBar

isFreeStanding

Boolean

true

false

JSlider

isFilled

Boolean

false

true

JTree

lineStyle

String

"Horizontal"

"Angled", "None"

 

还有一点要注意的是,更新客户属性后,必须调用repaint()或者revalidate(),因为组件在更新客户属性后,并不会自动更新其外观。

 

MetalTheme封装了L&F使用的color和font,通过创建自己的主题,就可以改变metal L&F的外观了。

下例创建了自己的theme——继承自DefaultMetalTheme:

// RedTheme.java

//

import javax.swing.plaf.*;

import javax.swing.plaf.metal.*;

 

public class RedTheme extends DefaultMetalTheme {

  public String getName( ) { return "Mars"; }

 

  private final ColorUIResource primary1 = new ColorUIResource(153, 102, 102);

  private final ColorUIResource primary2 = new ColorUIResource(204, 153, 153);

  private final ColorUIResource primary3 = new ColorUIResource(255, 204, 204);

 

  protected ColorUIResource getPrimary1( ) { return primary1; }

  protected ColorUIResource getPrimary2( ) { return primary2; }

  protected ColorUIResource getPrimary3( ) { return primary3; }

}

 

要使用这一主题,需要在程序开始时,调用这样的语句:

MetalLookAndFeel.setCurrentTheme(new RedTheme( ));

 

Metal Theme所能设置的属性很多,见下表:

MetalTheme properties

Property

Data type

get

is

set

Default value

acceleratorForeground

ColorUIResource

·

 

 

primary1

acceleratorSelectedForeground

ColorUIResource

·

 

 

black

control

ColorUIResource

·

 

 

secondary3

controlDarkShadow

ColorUIResource

·

 

 

secondary1

controlDisabled

ColorUIResource

·

 

 

secondary2

controlHighlight

ColorUIResource

·

 

 

white

controlInfo

ColorUIResource

·

 

 

black

controlShadow

ColorUIResource

·

 

 

secondary2

controlTextColor

ColorUIResource

·

 

 

controlInfo

controlTextFont

FontUIResource

·

 

 

Abstract

desktopColor

ColorUIResource

·

 

 

primary2

focusColor

ColorUIResource

·

 

 

primary2

highlightedTextColor

ColorUIResource

·

 

 

controlTextColor

inactiveControlTextColor

ColorUIResource

·

 

 

controlDisabled

inactiveSystemTextColor

ColorUIResource

·

 

 

secondary2

menuBackground

ColorUIResource

·

 

 

secondary3

menuDisabledForeground

ColorUIResource

·

 

 

secondary3

menuForeground

ColorUIResource

·

 

 

black

menuSelectedBackground

ColorUIResource

·

 

 

primary2

menuSelectedForeground

ColorUIResource

·

 

 

black

menuTextFont

FontUIResource

·

 

 

Abstract

name

String

·

 

 

Abstract

primaryControl

ColorUIResource

·

 

 

primary3

primaryControlDarkShadow

ColorUIResource

·

 

 

primary1

primaryControlHighlight

ColorUIResource

·

 

 

white

primaryControlInfo

ColorUIResource

·

 

 

black

primaryControlShadow

ColorUIResource

·

 

 

primary2

separatorBackground

ColorUIResource

·

 

 

white

separatorForeground

ColorUIResource

·

 

 

primary1

subTextFont

FontUIResource

·

 

 

Abstract

systemTextColor

ColorUIResource

·

 

 

primary1

systemTextFont

FontUIResource

·

 

 

Abstract

textHighlightColor

ColorUIResource

·

 

 

primary3

userTextColor

ColorUIResource

·

 

 

black

userTextFont

FontUIResource

·

 

 

Abstract

windowBackground

ColorUIResource

·

 

 

white

windowTitleBackground

ColorUIResource

·

 

 

primary3

windowTitleFont

FontUIResource

·

 

 

Abstract

windowTitleForeground

ColorUIResource

·

 

 

black

windowTitleInactiveBackground

ColorUIResource

·

 

 

secondary3

windowTitleInactiveForeground

ColorUIResource

·

 

 

black

 

【注】:观察上表,发现theme中主要涉及两类:color和font。

 

Theme的有关color的方法:

protected abstract ColorUIResource getPrimary1( )

protected abstract ColorUIResource getPrimary2( )

protected abstract ColorUIResource getPrimary3( )

protected abstract ColorUIResource getSecondary1( )

protected abstract ColorUIResource getSecondary2( )

protected abstract ColorUIResource getSecondary3( )

 

protected ColorUIResource getBlack( )

protected ColorUIResource getWhite( )

 

Theme还提供了一种定制手段,即通过方法:public void addCustomEntriesToTable(UIDefaults table)

例如:

public void addCustomEntriesToTable(UIDefaults table) {

    table.put("Tree.openIcon", new ImageIcon("open.gif"));

            table.put("Tree.closedIcon", new ImageIcon("closed.gif"))

}

九.定制LookAndFeel

1. 改变Component Properties;

2. 改变UI defaults设置;

以上算是静态的修改方法。

 

3. 动态改变UI defaults,见下例:

UIManager.put("Button.border", tripleBorder);

 

    // Custom icons for internal frames

    UIManager.put("InternalFrame.closeIcon", new ImageIcon("close.gif"));

    UIManager.put("InternalFrame.iconizeIcon", new ImageIcon("iconify.gif"));

 

4. 改变Metal L&F的theme和用户属性;

 

5. 创建自己的某种Component的ComponentUI,如MyMetalScrollBarUI

  (1) 在程序中,将该种Component的defaults值设置为新建class:

      UIManager.put("ScrollBarUI", "MyMetalScrollBarUI");

 

   (2) 或者,直接使用JComponent的setUI(ui)方法,单独为一个组件设置UI。

   

由于组件在构造时,就将UI Delegate设置好了。所以,在动态改变L&F之后,需要通知组件更新UI Delegate,一个常用的方法是调用SwingUtilities.updateComponentTreeUI() ,这个方法会递归的为包含在这个方法内的容器的所有组件更新UI delegate,如:

SwingUtilities.updateComponentTreeUI(getContentPane())

 

<全文完>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值