zoukankan      html  css  js  c++  java
  • 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]
    ToolTip.background=com.sun.java.swing.plaf.windows.DesktopProperty@6a3960
    Tree.focusInputMap=javax.swing.UIDefaults$LazyInputMap@13f136e
    Label.disabledForeground=com.sun.java.swing.plaf.windows.DesktopProperty@44cbbe
    ScrollBar.trackForeground=com.sun.java.swing.plaf.windows.DesktopProperty@12bf892
    FileChooser.homeFolderIcon=com.sun.java.swing.plaf.windows.WindowsLookAndFeel$LazyWindowsIcon@f1916f
    TextField.focusInputMap=javax.swing.UIDefaults$LazyInputMap@19762f
    info=javax.swing.plaf.ColorUIResource[r=255,g=255,b=225]
    RadioButton.interiorBackground=com.sun.java.swing.plaf.windows.DesktopProperty@141fab6
    EditorPane.inactiveBackground=com.sun.java.swing.plaf.windows.DesktopProperty@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);
  • 相关阅读:
    在nginx环境下搭建基于ssl证书的websocket服务转发,wss
    在nginx环境下搭建https服务,代理到本地web项目
    java CountDownLatch报错java.lang.IllegalMonitorStateException: null
    https本地自签名证书添加到信任证书访问
    10013: An attempt was made to access a socket in a way forbidden by its access permissions
    chrome 报错 ERR_CERT_AUTHORITY_INVALID
    SDKMAN一个基于命令行界面的SDK用户环境管理程序
    springboot放到linux启动报错:The temporary upload location [/tmp/tomcat.8524616412347407692.8111/work/Tomcat/localhost/ROOT/asset] is not valid
    netty-websocket-spring-boot-starter关闭报错 io/netty/channel/AbstractChannel$AbstractUnsafe io/netty/util/concurrent/GlobalEventExecutor
    HTML DOM addEventListener() 方法
  • 原文地址:https://www.cnblogs.com/wavky/p/3887259.html
Copyright © 2011-2022 走看看