我希望在输入可编辑的 JCombobox 时, JCombobox 的弹出菜单显示为autumaticaly,我这样做了有效 。但是,当我更改JCombobox
中箭头按钮的图标时,它不再起作用,如图所示
更改箭头按钮图标
之前
更改箭头按钮图标后(弹出窗口永不显示,当有人写入JCombobox
时)
这就是我所做的:
JTextComponent editor;
/** Creates new form combo */
public combo() {
initComponents();
editor = (JTextComponent) jComboBox1.getEditor().getEditorComponent();
jComboBox1.setEditable(true);
editor.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
char keyChar = e.getKeyChar();
if (jComboBox1.isDisplayable())
{
jComboBox1.setPopupVisible(true);
}
editor.setCaretPosition(editor.getText().length());
// System.out.println("wwwweeeee"+keyChar);
}
});
jComboBox1.setUI(new SynthComboBoxUI() {
protected JButton createArrowButton() {
JButton btn = new JButton();
btn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Image/error3.png")));
return btn;
}
});
}
Pleeeese帮忙,因为我真的厌倦了寻找解决方案
答案 0 :(得分:5)
这里的技术问题是编辑器由ui创建/维护。设置自定义ui时,它将被新编辑器替换,因此您正在侦听不再属于容器层次结构的组件。
挖了一点之后...我仍然没有解决方案:-(在面值上,在在编辑器上安装监听器之前调用setUI - BUT < / strong>调用setUI 总是错误......所以根本不这样做。
看到ui是基于合成器的,更新其视觉前/后属性的正确方法是提供自定义画家,每个应用程序或每个实例。 Nimbus特别允许通过“Nimbus.Overrides”客户端属性安装每个实例的自定义UIDefaults。要更改箭头按钮上的图标,适当的覆盖将是
Painter core = // a custom painter which paints the icon
comboDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", core);
combo.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
combo.putClientProperty("Nimbus.Overrides", comboDefaults);
一切都很好,除了没有工作 - 看起来像孩子们没有正确安装覆盖。
修改2
......几小时后......
从所有可用资源中,上面应该有效,请参见f.i.如何定义自定义属性的Jasper's initial explanation:
ComponentA:ChildComponentB.foreground,它允许您指定ComponentA中包含的ChildComponentB。
所以我怀疑它真的是一个bug。一个不太令人满意的黑客攻击是在按钮本身上安装覆盖:
JButton org = null;
for (int i = 0; i < combo.getComponentCount(); i++) {
if (combo.getComponent(i) instanceof JButton) {
org = (JButton) combo.getComponent(i);
UIDefaults buttonDefaults = new UIDefaults();
buttonDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", painter);
org.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
org.putClientProperty("Nimbus.Overrides", buttonDefaults);
break;
}
}
这根本不令人满意,因为按钮创建是由ui委托控制的,所以这个配置将无法在LAF切换后继续存在。或者反过来说:你需要安装一个带有UIManager的PropertyChangeListener,并且在检测到切换到Nimbus时,手动将组合中的覆盖复制到其子代。