java – 从JComboBox弹出窗口获取当前突出显示的项目(未选中项目)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 从JComboBox弹出窗口获取当前突出显示的项目(未选中项目),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3245字,纯文字阅读大概需要5分钟。
内容图文
我希望能够在JComboBox下拉列表中当前突出显示的项目发生变化时作出反应.请注意,我不是在寻找获取当前所选项目的方法,而是突出显示的项目.当鼠标悬停在此弹出窗口上时,它会在鼠标位置突出显示该项目,但这不会影响当前所选项目,因此我不能通过ItemListener或ActionListener来实现我想要的效果.
我正在尝试创建一个由JComboBox和耦合工具提示组成的组件,该工具提示显示当前突出显示的项目的附加信息(文档).
作为我的第一次尝试,我将一些代码添加到我的构造函数(扩展的JComboBox):
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleState;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.ComboPopup;
public class SomeFrame extends JFrame {
private MyComboBox combo;
public SomeFrame() {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(100,20);
setLocationRelativeTo(null);
setLayout(new BorderLayout());
combo = new MyComboBox();
combo.setModel(new DefaultComboBoxModel(new String[]{"one", "two", "three", "four"}));
add(combo);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
SomeFrame frame = new SomeFrame();
frame.setVisible(true);
}
});
}
// this is the important part
private static class MyComboBox extends JComboBox {
public MyComboBox() {
getAccessibleContext().addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (AccessibleContext.ACCESSIBLE_STATE_PROPERTY.equals(evt.getPropertyName())
&& AccessibleState.FOCUSED.equals(evt.getNewValue())
&& getAccessibleContext().getAccessibleChild(0) instanceof ComboPopup) {
ComboPopup popup = (ComboPopup) getAccessibleContext().getAccessibleChild(0);
JList list = popup.getList();
System.out.println("--> " + String.valueOf(list.getSelectedValue()));
}
}
});
}
}
}
它似乎工作,但我通过一些阴暗的渠道和试验/错误得到了这个代码,所以我认为必须有一个更好的方法来做到这一点.有任何想法吗?以上代码甚至生产安全吗?
解决方法:
好的问题和良好的解决方案 – 除了似乎在accessibleCombo中没有更新其在updateUI上的内部连线的错误,即切换LAF时:
>列表的可访问选择更改由注册到comboPopup列表的内部ListSelectionListener触发
> comboPopup由ui-delegate控制并在installUI中重新创建
> accessibleCombo不会将其内部列表更新为新创建和安装的内容
你无能为力.所以我会直接听清单选择,然后你可以完全控制LAF变化的重新布线:
public static class XComboBox extends JComboBox {
private ListSelectionListener listener;
public XComboBox() {
uninstall();
install();
}
@Override
public void updateUI() {
uninstall();
super.updateUI();
install();
}
private void uninstall() {
if (listener == null) return;
getPopupList().removeListSelectionListener(listener);
listener = null;
}
protected void install() {
listener = new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) return;
JList list = getPopupList();
System.out.println("--> " + String.valueOf(list.getSelectedValue()));
}
};
getPopupList().addListSelectionListener(listener);
}
private JList getPopupList() {
ComboPopup popup = (ComboPopup) getUI().getAccessibleChild(this, 0);
return popup.getList();
}
}
内容总结
以上是互联网集市为您收集整理的java – 从JComboBox弹出窗口获取当前突出显示的项目(未选中项目)全部内容,希望文章能够帮你解决java – 从JComboBox弹出窗口获取当前突出显示的项目(未选中项目)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。