我想自己做一个JComboButton组件,UI需要自己实现,于是我参考JComboBox写了一些文件,一共是11个,完全参照JComboBox来写的,其实就是把JComboBox的相关文件复制一份,然后把里面的相关内容由box改成button,然后编译通过。改完以后,文件结构如下:javax.swing ComboButtonModel.java
javax.swing ComboButtonEditor.java
javax.swing JComboButton.java
javax.swing DefaultComboButtonModel.java
javax.swing MutableComboButtonModel.javajavax.swing.plaf ComboButtonUI.javajavax.swing.plaf.basic BasicComboButtonEditor.java
javax.swing.plaf.basic BasicComboButtonPopup.java
javax.swing.plaf.basic BasicComboButtonRenderer.java
javax.swing.plaf.basic BasicComboButtonUI.java
javax.swing.plaf.basic ComboButtonPopup.java
写完之后,我在JComboButton类中加入了如下代码: private static final String uiClassID = "ComboButtonUI";
static{
UIManager.put(uiClassID,"javax.swing.plaf.basic.BasicComboButtonUI");
//UIManager.put(uiClassID,"javax.swing.plaf.ComboButtonUI");
}
同时重写了相关的方法: public void setUI(ComboButtonUI ui) {
super.setUI(ui);
} public void updateUI() {
setUI((ComboButtonUI)UIManager.getUI(this)); ListCellRenderer renderer = getRenderer();
if (renderer instanceof Component) {
SwingUtilities.updateComponentTreeUI((Component)renderer);
}
} public String getUIClassID() {
return uiClassID;
} public ComboButtonUI getUI() {
return(ComboButtonUI)ui;
}
结果组件在初始化的时候,报出了以下错误:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessError: tried to access method javax.swing.JComponent.setUIProperty(Ljava/lang/String;Ljava/lang/Object;)V from class javax.swing.JComboButton
at javax.swing.JComboButton.init(JComboButton.java:216)
at javax.swing.JComboButton.<init>(JComboButton.java:183)
at uitext.MainFrame.jbInit(MainFrame.java:53)
at uitext.MainFrame.<init>(MainFrame.java:40)
at uitext.UITest.<init>(UITest.java:27)
at uitext.UITest$1.run(UITest.java:65)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)问题是我已经在JComboButton类中静态注册了呀,为什么还是报这种错误?请问这种问题该怎么解决?还有,如果我想为此组件使用自己的颜色、字体,要在哪里进行初始化?
javax.swing ComboButtonEditor.java
javax.swing JComboButton.java
javax.swing DefaultComboButtonModel.java
javax.swing MutableComboButtonModel.javajavax.swing.plaf ComboButtonUI.javajavax.swing.plaf.basic BasicComboButtonEditor.java
javax.swing.plaf.basic BasicComboButtonPopup.java
javax.swing.plaf.basic BasicComboButtonRenderer.java
javax.swing.plaf.basic BasicComboButtonUI.java
javax.swing.plaf.basic ComboButtonPopup.java
写完之后,我在JComboButton类中加入了如下代码: private static final String uiClassID = "ComboButtonUI";
static{
UIManager.put(uiClassID,"javax.swing.plaf.basic.BasicComboButtonUI");
//UIManager.put(uiClassID,"javax.swing.plaf.ComboButtonUI");
}
同时重写了相关的方法: public void setUI(ComboButtonUI ui) {
super.setUI(ui);
} public void updateUI() {
setUI((ComboButtonUI)UIManager.getUI(this)); ListCellRenderer renderer = getRenderer();
if (renderer instanceof Component) {
SwingUtilities.updateComponentTreeUI((Component)renderer);
}
} public String getUIClassID() {
return uiClassID;
} public ComboButtonUI getUI() {
return(ComboButtonUI)ui;
}
结果组件在初始化的时候,报出了以下错误:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessError: tried to access method javax.swing.JComponent.setUIProperty(Ljava/lang/String;Ljava/lang/Object;)V from class javax.swing.JComboButton
at javax.swing.JComboButton.init(JComboButton.java:216)
at javax.swing.JComboButton.<init>(JComboButton.java:183)
at uitext.MainFrame.jbInit(MainFrame.java:53)
at uitext.MainFrame.<init>(MainFrame.java:40)
at uitext.UITest.<init>(UITest.java:27)
at uitext.UITest$1.run(UITest.java:65)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)问题是我已经在JComboButton类中静态注册了呀,为什么还是报这种错误?请问这种问题该怎么解决?还有,如果我想为此组件使用自己的颜色、字体,要在哪里进行初始化?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货