当前位置: 首页 > 面试题库 >

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

曹泉
2023-03-14
问题内容

我试图确定每个项目的确定性,如果它们在JComboBox下拉列表的JViewPort中不可见

(我的周五OT)

编辑:我不想实现MouseListener重复事件到System.out.print(…)

无法通过JCombo#Model通过使用SwingUtilities
http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html声明的JCombo#Model传递带有JList的JComboBox
,但是此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()

要回答这个问题:头和尾之间(包括首尾)之间的所有项目都是可见的,头和尾以上的所有项目都不可见;-)



 类似资料:
  • 问题内容: 在我的一些代码中,我将一系列对象放入列表中,并根据其属性(即字符串)构建了另一个列表。我需要确定第二个列表中的所有项目是否具有完全相同的值,而无需事先知道它是哪个值,然后返回布尔值,以便根据结果在代码中可以做不同的事情。 我事先不知道属性的名称,这就是为什么我试图使某些属性尽可能通用。 为了使示例更清楚,一个理想的函数“ all_same”将像这样工作: 我当时想制作一个唯一元素列表,

  • 问题内容: 在简单的清单中,下面的检查很简单: 但如果是列表列表,例如: 为了退货该如何解决? 问题答案: 使用内置功能尝试此操作。这是最惯用的解决方案,并且效率很高,因为一旦找到第一个匹配项,就会短路并停止:

  • 问题内容: 我有一个包含单个字母值列表的可编辑文件。因此,组合框非常小。 每个字母都有特殊的含义,在很少使用的字母的情况下,有时对用户来说并不清楚。因此,我创建了一个自定义,该自定义显示了下拉列表中每个字母的含义。 不幸的是,此解释不适合下拉菜单,因为它太小了,因为它的宽度与组合框相同。 有什么方法可以使下拉列表比组合框更宽? 这是我要实现的目标: 我无法更改组合框的宽度,因为该应用程序是对旧的旧

  • 问题内容: 我正在尝试使用Apache POI为一个单元添加一个下拉列表。下拉列表包含302个字符串。我总是收到此错误:Excel在test.xlsx中发现了不可读的内容。 然后,我进行了以下测试。当项目数<= 88时,下拉列表创建成功。当数字> 88时,打开excel文件且没有下拉列表时出现错误。 谢谢 !!! } 问题答案: 首先,我发现这不是Apache POI错误。这是Excel的限制。这

  • 我创建了一个JComboBox,其中填充了具有两个变量的项目:id和name(如上所示的代码)。我覆盖了toString函数,以便组合框显示两个字段之间的-。我想做的是当用户从下拉列表中选择某些内容时只显示id。我希望用户在单击箭头时能够同时看到id和名称,但我希望组合框在用户做出选择后只显示id。我该怎么做?谢谢。

  • 我在JSFIDLE示例中有以下代码 问题是,当用户单击“添加新记录”时,它会添加一个新项目,其中设施名称下拉列表显示列表中的第一个项目。如果用户单击“更新”,则会保存记录,但会将设施名称清空。原因是,下拉列表中确实没有选定项目。我之所以知道这一点,是因为所选值在传递给控制器代码时为空。所以,我真的很想知道如何 不显示列表中的第一个项目,直到用户在列表中实际选择它或 将选定的项目设置为列表中的第一个