使用自定义ComboBoxUI

时间:2013-08-29 22:53:10

标签: java swing jcombobox

我试图通过扩展BasicComboBoxUI类来改变JComboBox组件的外观。问题是当我使用扩展的MyComboBoxUI类时,组合框停止正常运行。

此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;
    }

}

1 个答案:

答案 0 :(得分:5)

我想你想要:

return new MyComboBoxUI();

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