gpt4 book ai didi

java - 未选择任何内容时如何设置 JComboBox 的标题?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:14 24 4
gpt4 key购买 nike

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

COUNTRY ▼
Spain
Germany
Ireland

我希望“COUNTRY”在所选索引为 -1 时显示,因此用户无法选择它。我试图将它放在第一个插槽上,然后覆盖 ListCellRenderer,使第一个元素显示为灰色,并处理事件,以便在尝试选择“标题”时选择第一个实际元素,但我认为这是一个肮脏的方法。

你能帮我一把吗?

最佳答案

重写 ListCellRenderer 是一个很好的方法,但您尝试了一些过于复杂的方法。如果您正在渲染单元格 -1 并且没有选择(值为空),则只显示某个字符串。您不仅限于在列表中显示元素。

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

enter image description here

enter image description here

完整代码:

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

渲染器中的 index == -1 是 head 组件,默认情况下,它显示所选项目以及我们希望在没有选择时放置标题的位置。

渲染器知道没有选择任何东西,因为传递给它的值为 null,这通常是这种情况。但是,如果出于某些奇怪的原因,您的列表中有可选择的空值,您可以通过将对组合框的引用传递给渲染器来让渲染器查询哪个是当前选定的显式索引,但这是完全不现实的。

关于java - 未选择任何内容时如何设置 JComboBox 的标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23882640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com