Java:使 jcombobox 的一项不可选择(如 sub-caption)并编辑该项目的字体
Java: Make one item of a jcombobox unselectable(like for a sub-caption) and edit font of that item
如何使组合框中的一个项目不可选择因为我需要用sub-topic分隔组合框中的项目.
是否可以单独修改该特定项目的字体?
jComboBox_btech_course.setFont(new java.awt.Font("Tahoma", 0, 14));
jComboBox_btech_course.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Select Course" }));
jComboBox_btech_course.setName("");
private class theHandler implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
//BTech courses
if(jComboBox_mtech_dept.getSelectedItem().equals("Civil Engineering"))
{
jComboBox_btech_course.removeAllItems();
jComboBox_btech_course.addItem("Building Construction");
jComboBox_btech_course.addItem("Principle And Practice");
jComboBox_btech_course.addItem("Surveying");
jComboBox_btech_course.addItem("Engineering Geology");
jComboBox_btech_course.addItem("Structural Analysis");
jComboBox_btech_course.addItem("Hydraulic Engineering");
jComboBox_btech_course.addItem("Environmental Engineering");
jComboBox_btech_course.addItem("Structural Design");
jComboBox_btech_course.addItem("Geotechnical Engineering");
/*This item has to be unselectable*/
jComboBox_btech_course.addItem("***Sub-topic***");
jComboBox_btech_course.addItem("Transportation Engineering");
jComboBox_btech_course.addItem("Foundation Engineering");
jComboBox_btech_course.addItem("Estimation & Valuation");
jComboBox_btech_course.addItem("Hydrology & Flood Control");
jComboBox_btech_course.addItem("System Analysis, Project Planning And Construction Management");
jComboBox_btech_course.addItem("Irrigation Engineering");
jComboBox_btech_course.addItem("Computer Application in Civil Engineering");
jComboBox_btech_course.addItem("Planning, Design & Detailing");
}
}
}
为了得到你需要的东西,你需要实施ComboBoxEditor
。
通过这种方式,您可以决定在您的情况下或在任何其他情况下要做什么
您可以通过
添加自定义 ItemListener
addItemListener(ItemListener aListener)
并在该方法中禁用选择或将选择切换到以上项目。
前言:在建议的解决方案中,我假设您要禁用以 "**"
开头的项目。您可以将此逻辑更改为您想要的任何内容。在改进的版本中,MyComboModel
class(见下文)甚至可以存储哪些项目被禁用,允许任意项目被标记为禁用。
您的问题的解决方案涉及两件事:
1。禁止选择您想要禁用的项目
为此,如果要选择的项目是禁用的,您可以使用自定义 ComboBoxModel
, and override its setSelectedItem()
方法不执行任何操作:
class MyComboModel extends DefaultComboBoxModel<String> {
public MyComboModel() {}
public MyComboModel(Vector<String> items) {
super(items);
}
@Override
public void setSelectedItem(Object item) {
if (item.toString().startsWith("**"))
return;
super.setSelectedItem(item);
};
}
您可以通过将其实例传递给 JComboBox
构造函数来设置此新模型:
JComboBox<String> cb = new JComboBox<>(new MyComboModel());
2。显示不同字体的禁用项目
为此,您必须使用自定义 ListCellRenderer
and in getListCellRendererComponent()
方法,您可以为禁用和启用的项目配置不同的视觉外观:
Font f1 = cb.getFont();
Font f2 = new Font("Tahoma", 0, 14);
cb.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof JComponent)
return (JComponent) value;
boolean itemEnabled = !value.toString().startsWith("**");
super.getListCellRendererComponent(list, value, index,
isSelected && itemEnabled, cellHasFocus);
// Render item as disabled and with different font:
setEnabled(itemEnabled);
setFont(itemEnabled ? f1 : f2);
return this;
}
});
如何使组合框中的一个项目不可选择因为我需要用sub-topic分隔组合框中的项目.
是否可以单独修改该特定项目的字体?
jComboBox_btech_course.setFont(new java.awt.Font("Tahoma", 0, 14));
jComboBox_btech_course.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Select Course" }));
jComboBox_btech_course.setName("");
private class theHandler implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
//BTech courses
if(jComboBox_mtech_dept.getSelectedItem().equals("Civil Engineering"))
{
jComboBox_btech_course.removeAllItems();
jComboBox_btech_course.addItem("Building Construction");
jComboBox_btech_course.addItem("Principle And Practice");
jComboBox_btech_course.addItem("Surveying");
jComboBox_btech_course.addItem("Engineering Geology");
jComboBox_btech_course.addItem("Structural Analysis");
jComboBox_btech_course.addItem("Hydraulic Engineering");
jComboBox_btech_course.addItem("Environmental Engineering");
jComboBox_btech_course.addItem("Structural Design");
jComboBox_btech_course.addItem("Geotechnical Engineering");
/*This item has to be unselectable*/
jComboBox_btech_course.addItem("***Sub-topic***");
jComboBox_btech_course.addItem("Transportation Engineering");
jComboBox_btech_course.addItem("Foundation Engineering");
jComboBox_btech_course.addItem("Estimation & Valuation");
jComboBox_btech_course.addItem("Hydrology & Flood Control");
jComboBox_btech_course.addItem("System Analysis, Project Planning And Construction Management");
jComboBox_btech_course.addItem("Irrigation Engineering");
jComboBox_btech_course.addItem("Computer Application in Civil Engineering");
jComboBox_btech_course.addItem("Planning, Design & Detailing");
}
}
}
为了得到你需要的东西,你需要实施ComboBoxEditor
。
通过这种方式,您可以决定在您的情况下或在任何其他情况下要做什么
您可以通过
添加自定义ItemListener
addItemListener(ItemListener aListener)
并在该方法中禁用选择或将选择切换到以上项目。
前言:在建议的解决方案中,我假设您要禁用以 "**"
开头的项目。您可以将此逻辑更改为您想要的任何内容。在改进的版本中,MyComboModel
class(见下文)甚至可以存储哪些项目被禁用,允许任意项目被标记为禁用。
您的问题的解决方案涉及两件事:
1。禁止选择您想要禁用的项目
为此,如果要选择的项目是禁用的,您可以使用自定义 ComboBoxModel
, and override its setSelectedItem()
方法不执行任何操作:
class MyComboModel extends DefaultComboBoxModel<String> {
public MyComboModel() {}
public MyComboModel(Vector<String> items) {
super(items);
}
@Override
public void setSelectedItem(Object item) {
if (item.toString().startsWith("**"))
return;
super.setSelectedItem(item);
};
}
您可以通过将其实例传递给 JComboBox
构造函数来设置此新模型:
JComboBox<String> cb = new JComboBox<>(new MyComboModel());
2。显示不同字体的禁用项目
为此,您必须使用自定义 ListCellRenderer
and in getListCellRendererComponent()
方法,您可以为禁用和启用的项目配置不同的视觉外观:
Font f1 = cb.getFont();
Font f2 = new Font("Tahoma", 0, 14);
cb.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof JComponent)
return (JComponent) value;
boolean itemEnabled = !value.toString().startsWith("**");
super.getListCellRendererComponent(list, value, index,
isSelected && itemEnabled, cellHasFocus);
// Render item as disabled and with different font:
setEnabled(itemEnabled);
setFont(itemEnabled ? f1 : f2);
return this;
}
});