Java 带有 tableHeaderUI 的 Swing UIManager

Java Swing UIManager with tableHeaderUI

按照此列表 http://thebadprogrammer.com/swing-uimanager-keys/,与字体和颜色相关的所有内容都可以,但我正在尝试为组件设置默认高度,并且该列表中的每个组件都有一个 xxxUI,我不知道如何实现.

我试过

UIManager.put("TableHeaderUI", new TableHeaderUI() {
        //it crashes empty aswell
        @Override
        public Dimension getPreferredSize(JComponent c) {
            return super.getPreferredSize(c);
        }
    });

但在运行时它崩溃了,每个 table header 都消失了,这是错误信息...

UIDefaults.getUI() failed: no ComponentUI class for: javax.swing.table.JTableHeader[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=16777224,maximumSize=,minimumSize=,preferredSize=,draggedDistance=0,reorderingAllowed=true,resizingAllowed=true,updateTableInRealTime=true]
java.lang.Error
    at javax.swing.UIDefaults.getUIError(Unknown Source)
    at javax.swing.MultiUIDefaults.getUIError(Unknown Source)
    at javax.swing.UIDefaults.getUI(Unknown Source)
    at javax.swing.UIManager.getUI(Unknown Source)
    at javax.swing.table.JTableHeader.updateUI(Unknown Source)
    at javax.swing.table.JTableHeader.<init>(Unknown Source)
    at javax.swing.JTable.createDefaultTableHeader(Unknown Source)
    at javax.swing.JTable.initializeLocalVars(Unknown Source)
    at javax.swing.JTable.<init>(Unknown Source)
    at javax.swing.JTable.<init>(Unknown Source)

None好像是用这个属性,我没找到具体的例子。

你破坏了 UIManager 因为你放了一个错误类型的对象 对于键 "TableHeaderUI"

相反,对于键 "TableHeaderUI",值应该是 String (给出 class 的完全限定名称 实现接口 javax.swing.plaf.TableHeaderUI).

例如你可以这样做:

UIManager.put("TableHeaderUI", MyTableHeaderUI.class.getName());

实现方式 class 如下:

public class MyTableHeaderUI extends BasicTableHeaderUI {

    // UIDefaults.getUI(JComponent) will call this method via reflection
    public static ComponentUI createUI(JComponent h) {
        return new MyTableHeaderUI();
    }

    @Override
    public Dimension getPreferredSize(JComponent c) {
        return super.getPreferredSize(c);
    }
}

一个特别的事情(远非显而易见)是:你需要实现你自己的 static createUI(JComponent) 方法,否则你的 UI class 将永远不会被实例化。请参阅 UIDefaults.getUI(JComponent).

的 javadoc