Swing中使用UIManager批量自定义单一JComponent组件默认属性

最近在研究Swing,被它的复杂性气的快吐血了,刚才本打算把JFrame的背景色换成白底,结果发现事情没想象中那么顺利,调用setBackground完全没有效果,猛然醒悟到JPanel本身是带不透明底色的,事情一下子变得复杂起来了,因为即便最简单的窗口布局,也是嵌套了若干层JPanel、JSplitPane等容器的,一层遮盖一层,而要想统一改成白底的话,那得一个个改代码,或者用复杂的遍历算法...

百度上寻觅了一下,发现一个老去已久的帖子有提及到使用UIManager来批量更改默认值的,例如:

UIManager.put("Panel.background",new Color(250,250,250,0));

短短一行即改变了所有JPanel的background颜色为透明色,这样直接在frame上设置一下背景色就可以直接层层穿透上来了,实际运行效果也非常不错,不受实际设定的L&F影响,完美的自定义了组件属性。

* 后来发现这样改实在太暴力,有些组件的表现出现了超预期的UI崩坏,例如JFileChooser等..

除了背景色外,当然理应还有其他各种各样的属性可以通过这种方式来更改默认值,但是具体有哪些合法的属性参数,据说要翻源码和相关资料文档,对于想笔主这种懒人来说断然是不可接受的!

因此笔主用上了吃奶的智慧,终于找到作弊方法,通过下面一行代码把所有能改的参数全部列了出来:

System.out.println(Arrays.toString(UIManager.getDefaults().entrySet().toArray()));

但是结果很长很凌乱,超了控制台的最大显示高度,稍微整理一下:

Object[] list = (Object[]) UIManager.getDefaults().entrySet().toArray();
try {
    FileWriter fw = new FileWriter(new File("c:/UIManagerDefaults.txt"));
    BufferedWriter bw = new BufferedWriter(fw);
    for(Object o:list){
        bw.write(o.toString());
        bw.newLine();
    }
    bw.flush();
    bw.close();
} catch (IOException e1) {
    e1.printStackTrace();
}

输出来的文件:

AuditoryCues.noAuditoryCues=[Ljava.lang.Object;@bb494b
inactiveCaptionBorder=javax.swing.plaf.ColorUIResource[r=244,g=247,b=252]
Too[email protected]6a3960
[email protected]
Label.dis[email protected]44cbbe
ScrollBar.[email protected]12bf892
FileChooser.homeFolderIcon=com[email protected]f1916f
[email protected]2f
info=javax.swing.plaf.ColorUIResource[r=255,g=255,b=225]
RadioButton.int[email protected]141fab6
EditorPane.ina[email protected]141fab6
CheckBox.textIconGap=4
menuText=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0]
TabbedPane.selectedTabPadInsets=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=1]
ComboBox.isEnterSelectablePopup=false
.....(内容太多,略)

使用的话就像这样:

UIManager.put("ComboBox.isEnterSelectablePopup", true);

Swing中使用UIManager批量自定义单一JComponent组件默认属性

时间: 2024-10-24 04:40:34

Swing中使用UIManager批量自定义单一JComponent组件默认属性的相关文章

【Swing】理解Swing中的事件与线程

talk is cheap , show me the code. Swing中的事件 事件驱动 所有的GUI程序都是事件驱动的.Swing当然也是. GUI程序不同于Command Line程序,一个很大的区别是程序执行的驱动条件:命令行程序是接受用户输入的文本参数,对命令解析,然后通过类似switch的选择来执行不同的功能模块.而GUI程 序就不一样了.GUI程序由界面元素组成,如Button,CheckBox,TextArea,等等.用户操作不同的组件,就会引发不同的事件,然后, 程序编写

Java 图形用户界面之javax.swing包(四) Container、JComponent、JApplet

Class Container 实现的接口有ImageObserver , MenuContainer , Serializable 已知直接子类BasicSplitPaneDivider , CellRendererPane , DefaultTreeCellEditor.EditorContainer , JComponent , Panel , ScrollPane , Window 继承Component 该类是在java.awt包中的 通用抽象窗口工具包(AWT)容器对象是可以包含其他

swing中的分层

swing中的分层 摘自:https://blog.csdn.net/levelmini/article/details/26692205 2014年05月23日 12:42:56 阅读数:1244 今天在练习swing相关的内容.突然想到,html中的CSS可以控制分层,windows中的纸牌也是按层显示的,java也肯定有了.看了半天API没找到控制层的方法,在网上倒是找到不少分层显示的例子,但是按照例子练习的时候结果总是不理想,总有各种小瑕疵,完全不知道是怎么回事.再次百度的时候发现了关于

Excel技巧|如何在Excel中快速的批量将unix时间戳转化为北京时间

本文标签:  Excel技巧 unix时间戳转化北京时间 Excel时间戳转化北京时间 互联网杂谈 批量将将unix时间戳转化为北京时间 方法/步骤 单击要获得北京时间的那一列,右键,选择[设置单元格格式],在弹出的窗口中,左侧选择 [日期],右侧选择你想要的时间格式,点击确定. 选中其中一个单元格,输入公式 =(A2+8*3600)/86400+70*365+19 其中,A2是要转化的时间戳的单元格. 输入完公式,按下[回车键]. 该时间戳即转化为北京时间. 选中上面转化好的北京时间单元格,鼠

Excel中拖放填充与自定义序列

记得刚用excel的时候,对填充功能还不甚了解,以至于做过对相邻挨个单元格粘贴相同公式,然后再更改单元格引用的傻事.自从知道了填充后,往下一拖相应的公式和单元格引用就都做好了.运用填充和序列,虽然不是什么受人顶礼膜拜的技能,但熟练掌握确实可以提高工作效率. 注意数值型需要提供前两个数据,其他类型只要提供前一个数据即可,而且并不需要从序列的第一个数据开始输入.另外除了拖动填充柄还可以双击填充柄进行填充. 当你在一个单元格输不同类型的数据,然后进行拖放,excel会产生不同的效果,比如你在A1输入一

Asp.net中动态控制RDLC报表 自定义RDLC

转载自: http://dlwang2002.cnblogs.com/archive/2006/05/27/410499.html 在asp.net程序中,可以选择使用水晶报表,功能确实强大.但是web版的水晶报表好像存在版权的问题.如果所作报表不是复杂的一塌糊涂的话,可以使用微软自带的Rdlc报表.已经有老兄做出了不少诠释:http://www.cnblogs.com/waxdoll/更多资料可以在这里找到:http://www.gotreportviewer.com/Rdlc优点:1:Rdl

SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地址码 . FlightID Varchar(10) NULL, --航班号) 2/ 建立存储过程 USE DF17DataProIF EXISTS (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[BulkDataP

Java Swing中的SwingWorker

Swing中的SwingWorker主要是用来执行比较耗时的任务. Java doc文档中中包含了一些简单的例子. An abstract class to perform lengthy GUI-interaction tasks in a background thread. Several background threads can be used to execute such tasks. However, the exact strategy of choosing a threa

Android中使用ListView绘制自定义表格(2)

上回再写了<Android中使用ListView绘制自定义表格>后,很多人留言代码不全和没有数据样例.但因为项目原因,没法把源码全部贴上来.近两天,抽空简化了一下,做了一个例子. 效果图如 一.功能: 1.支持列合并 2.考虑了界面刷新优化 3.预留部分接口 4.支持左右滚动 1.枚举类:CellTypeEnum package csdn.danielinbiti.custometableview.item; public enum CellTypeEnum { STRING //字符 ,DI