2013-08-29 50 views
2

我想通过扩展BasicComboBoxUI类来改变JComboBox组件的外观。问题是,当我使用扩展的MyComboBoxUI类时,组合框停止正常工作。使用自定义组合框UI

这个SSCCE正在证明我的问题。第一个组合框显示第二个组合框的选定项目,并且第一个组合框没有绘制箭头按钮并且无法选择项目。

注:我没有这样更换JButton组件的问题。

主要类:

import javax.swing.JFrame; 
import javax.swing.UIManager; 

public class Main { 

    public static void main(String[] args) { 

     UIManager.put("ComboBoxUI", "MyComboBoxUI"); 

     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(); 
       ContentPane contentPane = new ContentPane(); 
       frame.setContentPane(contentPane); 
       frame.setSize(600, 400); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

ContenPane类:

import java.awt.FlowLayout; 
import javax.swing.JComboBox; 
import javax.swing.JPanel; 

public class ContentPane extends JPanel { 

    public ContentPane() { 
     setLayout(new FlowLayout()); 
     JComboBox<String> firstComboBox = new JComboBox<>(); 
     firstComboBox.addItem("firstComboBox - 1. item"); 
     firstComboBox.addItem("firstComboBox - 2. item"); 
     firstComboBox.addItem("firstComboBox - 3. item"); 
     add(firstComboBox); 
     JComboBox<String> secondComboBox = new JComboBox<>(); 
     secondComboBox.addItem("secondComboBox - 1.item"); 
     secondComboBox.addItem("secondComboBox - 2. item"); 
     secondComboBox.addItem("secondComboBox - 3. item"); 
     add(secondComboBox); 
    } 
} 

MyComboBoxUI类:

import javax.swing.JComponent; 
import javax.swing.plaf.ComponentUI; 
import javax.swing.plaf.basic.BasicComboBoxUI; 

public class MyComboBoxUI extends BasicComboBoxUI { 

    private static MyComboBoxUI myComboBoxUI = new MyComboBoxUI(); 

    public static ComponentUI createUI(JComponent component) { 
     return myComboBoxUI; 
    } 

} 

回答

5

我想你想:

return new MyComboBoxUI(); 

当你有一个静态变量时,这意味着每个组合框将共享相同的UI实例。

+0

我有一些问题,因为总是返回相同的实例。你能解释为什么返回一个新实例很重要吗? –