`
henry406
  • 浏览: 115789 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JComboBox实现下拉框向上显示

    博客分类:
  • java
阅读更多
JComboBox 向上弹出
写一个东西用到了 JComboBox,缺省情况下下拉框的列表是向下弹出的(否则也不会叫“下拉框”了,呵呵),但现在想要实现让它往上弹出这么一个功能。首先要看的就是 JComboBox 本身是否支持,比如有一个属性可以直接指定让它往下或者往上弹出,很遗憾,没有找到。它弹出其实是一个类似于弹出菜单的一个东西,就想着是不是能在弹出之前设定一下位置,就可以指定在哪里弹出了,跟弹出菜单的原理一样。

首先一个问题是怎么才能知道弹出列表就要弹出呢?运气还不错,JComboBox 里面有 addPopupMenuListener 这个方法,PopupMenuListener 里有 popupMenuWillBecomeVisible() 应该就是在弹出列表显示之前会调用的了。

下一个问题就是怎么才能拿到这个弹出列表的引用,本以为 JComboBox 本身就提供了,没想到竟然没找到,Google 也没找出来,只好自己看代码,从 javax.swing.JComboBox:setPopupVisible() 方法知道,弹出列表通过 UI 来控制的,然后在 javax.swing.plaf.basic.BasicComboBoxUI:installUI() 找到了创建的代码 popup = createPopup();,返回的对象是 BasicComboPopup,是从 JPopupMenu 继承下来的。那怎么才能拿到 popup 的引用呢?在这个类里直接查找“popup”,最后找到了 getAccessibleChild() 这个方法,里面的注释也说明第 0 个子控件就是我们千辛万苦所要寻找的弹出列表了,哈哈。

这下就好办了,加一个监听器,将 popup 的位置往上挪整个控件的高度这么大的距离,就可以达到我们的目的。

PopupComboBox.java
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.basic.BasicComboPopup;

/**
 * @author SuperMMX
 */
class PopupComboBox {

   public static void main(String[] args) {

       Object[] values = { "Zhang San", "Li Si", "Wang Wu", "Sun Liu"};

       JFrame frame = new JFrame("Pop *UP* JComboBox");
       JComboBox comboBox = new JComboBox(values);
      comboBox.addPopupMenuListener(new PopupMenuListener() {
               public void popupMenuCanceled(PopupMenuEvent e) {
                   // Don't care
               }
             
               public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                   // Don't care
               }

               public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                   JComboBox comboBox = (JComboBox)e.getSource();
                   BasicComboPopup popup = (BasicComboPopup)comboBox.getUI().getAccessibleChild(comboBox, 0);
                   int height = popup.getHeight();
                   if (height == 0) {
                       height = popup.getPreferredSize().height;
                   }
                   popup.setLocation(comboBox.getLocationOnScreen().x, comboBox.getLocationOnScreen().y - height);
               }
           }
           );
       frame.add(comboBox, BorderLayout.PAGE_END);
     
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setSize(250, 150);
       frame.setVisible(true);
   }
} 

结果如图所示:



第 25 行,在弹出列表第一次显示之前,高度其实是不知道的,所以如果直接用 height 的话第一次弹出位置是不对的,第二次才会正确。
错误的结果如图所示:


这样写起来是可以用了,但有几个空方法放着很不爽,继续研究 JComboBox,发现它里面直接支持 firePopupMenuWillBecomeVisible(),这样只要继承 JComboBox,重写 firePopupMenuWillBecomeVisible() 方法,将以上相关代码写进去就可以了。这样看起来清爽一些。代码如下:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.basic.BasicComboPopup;
 
/**
 * @author SuperMMX
 */
class PopupComboBox extends JComboBox {
 
    public PopupComboBox(Object[] values) {
        super(values);
    }
 
    public static void main(String[] args) {
 
        Object[] values = { "Zhang San", "Li Si", "Wang Wu", "Sun Liu"};
 
        JFrame frame = new JFrame("Pop *UP* JComboBox");
        JComboBox comboBox = new PopupComboBox(values);
        frame.add(comboBox, BorderLayout.PAGE_END);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(250, 150);
        frame.setVisible(true);
    }
 
    public void firePopupMenuWillBecomeVisible() {
        // Pop *UP*
        BasicComboPopup popup = (BasicComboPopup)getUI().getAccessibleChild(this, 0);
        int height = popup.getHeight();
        if (height == 0) {
            height = popup.getPreferredSize().height;
        }
        popup.setLocation(getLocationOnScreen().x, getLocationOnScreen().y - height);
        super.firePopupMenuWillBecomeVisible();
    }
}
  • 大小: 4.7 KB
  • 大小: 4.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JComboBox下拉框多选

    在标题"JComboBox下拉框多选"中提到的场景,就是将`JComboBox`与`JCheckBox`相结合,以实现用户可以从下拉列表中选择多个选项的功能。 以下是一个详细的解释: 1. **JComboBox的基本使用**: `JComboBox`是Java ...

    java 实现下拉列表JComboBox中值和显示不同

    Java 实现下拉列表 JComboBox 中值和显示不同 在 Java 中,实现下拉列表 JComboBox 中值和显示不同是一种常见的需求。下拉列表 JComboBox 是 Java 中的一种 GUI 组件,用于提供用户选择多个选项。通常情况下,我们...

    Java Swing JComboBox下拉列表框的示例代码

    Java Swing JComboBox 下拉列表框的示例代码 Java Swing JComboBox 下拉列表框是一种常用的 GUI 组件,它允许用户从多个选项中选择一个值。下面将详细介绍 JComboBox 的基本概念、常用构造方法、常用方法和示例代码...

    java swing 多选下拉框 支持动态加载数据

    在Swing中,多选下拉框通常由JComboBox类实现,但默认的JComboBox只支持单选。为了实现多选功能,我们需要扩展JComboBox或者使用第三方库,如JList或JTable与弹出面板组合。 本主题涉及的知识点主要包括以下几个...

    ToolBar上添加滚动条和下拉框

    本话题主要探讨如何在`ToolBar`上添加滚动条和下拉框,并实现它们之间的交互关联。 首先,我们需要理解`ToolBar`的基本概念。`ToolBar`通常出现在桌面应用或者网页应用中,它可以是水平布局或垂直布局,包含了一...

    Java下拉框监听,加入界面,切换界面的处理

    本篇文章将深入探讨如何在Java中实现下拉框的监听、将其添加到界面以及处理界面的切换。 首先,Java提供了两种主要的API来创建和操作下拉框:Java Swing和JavaFX。这里我们主要关注Swing,因为它在许多桌面应用开发...

    java JComboBox的事件处理

    本篇文章将深入探讨Java中JComboBox的事件处理机制,以及如何通过编程实现这些功能。 JComboBox的事件主要分为两类:ActionEvent和ItemEvent。ActionEvent通常发生在用户从下拉列表中选择一个选项并点击确认按钮...

    用JComboBox和JList实现的一个文件浏览器组件

    4. 自定义渲染:为了使组件更易于阅读和理解,可以自定义`ListCellRenderer`和`ComboBoxRenderer`,以改变列表和下拉框中项的显示样式,比如添加图标以区分文件类型。 5. 事件处理:添加适当的事件处理器,例如`...

    中国省市区三级联动的JCombobox源代码

    - Java Swing提供了事件监听机制,开发者可以注册监听器到`JComboBox`,在用户做出选择时触发相应事件,如`ItemListener`或`ActionListener`,从而更新其他联动的下拉框。 5. **XML数据存储**: - 标签提到XML...

    Swing控件,多选下拉框

    要实现多选下拉框功能,我们需要自定义组件或者使用第三方库来扩展`JComboBox`的功能。 ### 一、自定义多选下拉框 自定义多选下拉框通常涉及以下几个关键步骤: 1. **创建自定义模型**:你需要创建一个自定义的`...

    java JComboBox的使用

    Java `JComboBox` 是 Swing 组件库中的一个控件,用于在下拉列表中显示一组可选择的选项。它提供了一个简单的用户界面,允许用户从预定义的选项中进行单选。`JComboBox` 在 Java 图形用户界面(GUI)编程中非常常见...

    JComboBox级联

    在本示例中,主要通过监听`JComboBox`的选择变化事件,并根据选择结果动态创建新的`JComboBox`来实现级联效果。具体来说,当用户在一个`JComboBox`中做出选择后,程序会触发级联逻辑,创建新的`JComboBox`并将其添加...

    java美化下拉框Demo

    this.setTitle("下拉框美化"); this.setSize(800, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container = getContentPane(); container.setLayout(null); String[] strArr...

    swing效果点击下拉框自动填充文本框

    在Java的Swing库中,实现“点击下拉框自动填充文本框”的功能,涉及到Swing组件的交互、事件监听以及数据绑定的概念。这个功能在许多GUI应用中都非常常见,例如用户选择一个选项后,相应的文本框会自动更新为所选...

    图片下拉框示例(ImageComboBoxDemo)

    通过扩展或自定义`JComboBox`,可以添加显示图像的功能。这通常涉及到创建一个自定义的渲染器,使得每个组合框项在显示时能够同时包含图像和文本。渲染器是一个关键的概念,因为它决定了组件如何在屏幕上呈现数据。 ...

    JComboBox动态绑定数据库

    总结,这个实例展示了如何利用Java Swing的`JComboBox`结合`JDBC`技术,动态地从`SQL2000`数据库获取数据并显示在下拉列表中。通过监听用户的选择变化,可以实现灵活的数据交互。这种动态绑定数据的方法在各种需要与...

    下拉列表中显示图标

    对于Java桌面应用,可以使用JComboBox控件并自定义其渲染器来实现。你需要创建一个继承自DefaultListCellRenderer的类,重写`getListCellRendererComponent`方法,在其中添加图标展示的逻辑。 4. **前端框架**: ...

    java写的日期下拉框控件

    总的来说,使用Java Swing 编写日期下拉框控件涉及到导入第三方库、创建组件、设置事件监听以及实现日期比较工具类。这个控件可以广泛应用于数据输入、日程安排等场景,提高用户界面的交互性。在实际项目中,你可能...

    swing 模板QQ登录下拉框

    总结来说,Swing中的JComboBox可以用来创建下拉框,通过自定义渲染器可以实现图片和用户名的显示,而鼠标事件监听器则可以用来添加鼠标悬浮时的动态效果。在实际开发中,可以根据需求调整和优化这些代码,以满足特定...

    Java Swing组件下拉菜单控件JComboBox用法示例

    JComboBox还提供了一些高级用法,例如可以使用setEditable方法设置是否允许用户编辑选项的文本,使用setMaximumRowCount方法设置最大显示行数等。例如: `comboBox.setEditable(true);` `comboBox....

Global site tag (gtag.js) - Google Analytics