Cal*_*Sea 2 java swing jcombobox
我所希望的,在编辑打字的时候的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;
}
});
}
Run Code Online (Sandbox Code Playgroud)
Pleeeese帮忙,因为我真的厌倦了寻找解决方案
这里的技术问题是编辑器由ui创建/维护.设置自定义ui时,它将被新编辑器替换,因此您正在侦听不再属于容器层次结构的组件.
挖了一下......我仍然没有解决方案:-(在面值上,你在编辑器上安装监听器之前调用setUI - 但是调用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);
Run Code Online (Sandbox Code Playgroud)
一切都很好,除了没有工作 - 看起来像是没有正确安装孩子的覆盖.
编辑2
... 几个小时以后 ...
从所有可用的资源,上面应该工作,请参阅fi Jasper关于如何定义自定义属性的初步解释:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这根本不令人满意,因为按钮创建是由ui委托控制的,所以这个配置将无法在LAF切换后继续存在.或者反过来说:你需要安装一个带有UIManager的PropertyChangeListener,并且在检测到切换到Nimbus时,手动将组合的覆盖复制到其子代.
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |