如果没有选择任何内容,如何设置JComboBox的标题?

hel*_*013 5 java user-interface swing jcombobox

我想在我的Swing应用程序中有一个JCombobox,它在没有选择任何内容时显示标题.像这样的东西:

国家▼
西班牙
德国
爱尔兰

我希望"COUNTRY"在所选索引为-1时显示,因此用户将无法选择它.我试图把它放在第一个插槽然后覆盖ListCellRenderer,所以第一个元素显示为灰色,并处理事件所以当试图选择"标题"时,它选择第一个实际元素,但我认为这是一个脏做法.

你能借给我一个手吗?

DSq*_*are 9

覆盖这ListCellRenderer 是一个很好的方法,但你尝试过于复杂的东西.如果要渲染单元格-1并且没有选择(值为null),则只显示某个字符串.您不仅限于列表中的显示元素.

以下是演示它的示例程序:

在此输入图像描述

在此输入图像描述

完整代码:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;

public class ComboBoxTitleTest
{
    public static final void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run()
            {
                new ComboBoxTitleTest().createAndShowGUI();
            }
        });
    }

    public void createAndShowGUI()
    {
        JFrame frame = new JFrame();

        JPanel mainPanel = new JPanel();
        JPanel buttonsPanel = new JPanel();
        frame.add(mainPanel);
        frame.add(buttonsPanel, BorderLayout.SOUTH);

        String[] options = { "Spain", "Germany", "Ireland", "The kingdom of far far away" };

        final JComboBox comboBox = new JComboBox(options);
        comboBox.setRenderer(new MyComboBoxRenderer("COUNTRY"));
        comboBox.setSelectedIndex(-1); //By default it selects first item, we don't want any selection
        mainPanel.add(comboBox);

        JButton clearSelectionButton = new JButton("Clear selection");
        clearSelectionButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                comboBox.setSelectedIndex(-1);
            }
        });
        buttonsPanel.add(clearSelectionButton);

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    class MyComboBoxRenderer extends JLabel implements ListCellRenderer
    {
        private String _title;

        public MyComboBoxRenderer(String title)
        {
            _title = title;
        }

        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean hasFocus)
        {
            if (index == -1 && value == null) setText(_title);
            else setText(value.toString());
            return this;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

渲染器中的index == -1是头部组件,默认情况下,显示所选项目以及我们想要在没有选择时放置标题的位置.

渲染器知道没有选择,因为传递给它的值为null,通常就是这种情况.但是,如果由于一些奇怪的原因,您在列表中有可选的空值,您可以让渲染器通过向comboBox传递引用来查询哪个是显式当前选择的索引,但这是完全不现实的.

  • +1,但不是创建一个全新的渲染器,我只是扩展默认渲染器,如[组合框提示]中所示(http://tips4java.wordpress.com/2008/10/18/combo-box-prompt/) . (2认同)