JComboBox 确定项目在下拉列表中是否可见
我试图确定每个项目在 JComboBox 下拉列表的 JViewPort 中是否可见
(我的星期五加班)
编辑:我不想实现 MouseListener 以将事件重复到 System.out.print(...)
不可能通过使用 SwingUtilities http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html ,但是这个 APi 超出了我的...
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ItemVisibleRecCombo extends JFrame {
private static final long serialVersionUID = 1L;
private JComboBox fontsBox;
public ItemVisibleRecCombo() {
String[] numbers = {"one", "two", "three", "four", "five", "six", "seven"};
fontsBox = new JComboBox(numbers);
fontsBox.setSelectedItem(0);
fontsBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
manItemInCombo();
}
}
});
fontsBox.setModel(new DefaultComboBoxModel(numbers));
fontsBox.setMaximumRowCount(3);
add(fontsBox, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(400, 60));
setLocation(200, 105);
pack();
setVisible(true);
}
private void manItemInCombo() {
if (fontsBox.getItemCount() > 0) {
final Object comp = fontsBox.getUI().getAccessibleChild(fontsBox, 0);
if ((comp instanceof JPopupMenu)) {
final JList list = new JList(fontsBox.getModel());
final JPopupMenu popup = (JPopupMenu) comp;
final JScrollPane scrollPane = (JScrollPane) popup.getComponent(0);
final JViewport viewport = scrollPane.getViewport();
final Rectangle rect = popup.getVisibleRect();
Point pt = viewport.getViewPosition();
for (int i = 0; i < list.getModel().getSize(); i++) {
pt = list.indexToLocation(i);
System.out.print(pt + " - ");
rect.setLocation(rect.x - pt.x, rect.y - pt.y);
System.out.println(new Rectangle(viewport.getExtentSize()).contains(rect));
}
}
}
}
public static void main(String arg[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ItemVisibleRecCombo ivrc = new ItemVisibleRecCombo();
}
});
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
基本上,您正在寻找 list.locationToIndex (如果我理解正确的话),类似于
顺便说一句,还有另一个未传递到列表的属性:本应
回答这个问题:第一个/最后一个之间的所有项目(包含在内),是可见的,第一个上方和最后一个下方的所有项目都不可见;-)
Basically, you'r looking for list.locationToIndex (if I understood you correctly), something like
BTW, yet another property that's not passed on to the list: would have expected
To answer the question: all items between first/last, inclusively, are visible, all items above first and below last not visible ;-)
如果它涉及获取组合框中可见的元素,我这里有一个算法,您可以使用
它检查它会返回您的第一个和最后一个可见元素,然后由您决定如何处理它们。
编辑:这只是一个基于给定示例构建的快速(且令人讨厌)的解决方案。如需更好的解决方案,请参阅@kleopatra 的解决方案。
If it goes about getting the elements which are visible in the your combobox I have an algorithm here which you could use
Check it out it returns you first and last visible element then it is up to you what you want to to with them.
EDIT: This is just a quick (& nasty) solution build on top of the given example. For a better solution please see @kleopatra 's solution.
将监听器从
ItemListener
更改为ActionListener
似乎给出了预期的结果,无论是对于箭头键还是单击:Changing the listener from
ItemListener
toActionListener
seems to give the expected results, both for arrow keys and clicking:谢谢你,但你的假设不正确,这里是输出,我仍然无法测试 ViewPort 是否包含 Item 或不正确,没办法,我必须返回到我的原始声明,因为它正确显示第一个可见 Item phaaaa
编辑谢谢@ Anthony Accioly 以获得正确的建议
将侦听器从 ItemListener 更改为 ActionListener
ItemListener
的错误输出和
ActionListener
的预期输出编辑后的代码
thank you, but your assumptions weren't correct, here is output, still I can't test if ViewPort contains Item or not correctly, no way, I must return to my original declaration, because that show first visible Item correctly phaaaa
EDIT thanks @ Anthony Accioly for correct sugestion
Changing the listener from ItemListener to ActionListener
wrong outPut from
ItemListener
and expected output from
ActionListener
Edited code