java - JComboBox 确定项目是否在下拉列表中可见

标签 java swing popup jcombobox viewport

我试图确定每个项目是否在 JComboBox 下拉列表的 JViewPort 中可见

(我的周五加类)

编辑:我不想为 System.out.print(...) 的 Repeats 事件实现 MouseListener

不可能将 JComboBox 与 JList 一起传递,由 JCombo#Model 使用 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();
            }
        });
    }
}

最佳答案

基本上,您正在寻找 list.locationToIndex(如果我理解正确的话),例如

    Accessible a = fontsBox.getUI().getAccessibleChild(fontsBox, 0);
    if (a instanceof javax.swing.plaf.basic.ComboPopup) {
        JList list = ((javax.swing.plaf.basic.ComboPopup)a).getList();
        Rectangle rect = list.getVisibleRect();
        int first = list.locationToIndex(rect.getLocation());
        // similar for last, at the lower edge of the visible rect, left as exercise <g>
        // Edit: as of @Boro's comment, last is easier calculated with maxRowCount
        int last = first + fontsBox.getMaximumRowCount() - 1;
        ....

顺便说一句,还有一个属性没有传递到列表中:本来是可以预期的

   list.getVisibleRowCount() == combo.getMaximumRowCount()   

要回答这个问题:第一个/最后一个之间的所有项目(包含在内)都是可见的,所有高于第一个和低于最后一个的项目都不可见;-)

关于java - JComboBox 确定项目是否在下拉列表中可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5911865/

相关文章:

java - 退出按钮不起作用

blackberry - 黑莓上弹出窗口的白色边框

java - 使用 JSch 通过按钮发送命令

Java8 LocalDateTime解析错误

java - 将 Swing 计时器的操作监听器中的 System.currentTimeMillis() 分配回未初始化的 long 变量

ios - 弹出式 UIViewController

android - 如何在Android应用程序中防止 “complete action using”对话框

java - 在 Guice 中获取所有绑定(bind)的单例

java - 在没有工作区的情况下使用 Java SDK 以编程方式将文件提交到 TFS

java - JTable中的并发问题