java - 如果我在项目可见时添加项目,则不会调整 JComboBox 弹出窗口的大小

标签 java swing popup jcombobox

我的 JComboBox 弹出窗口有问题。我的 JComboBox 有一个类似谷歌搜索框的自动完成实现。

所以,问题是如果我在弹出窗口可见时添加或删除项目,它不会调整大小,我需要关闭并重新打开它。但是这个火 popupBecomeInvisible 和 popupBecomeVisible 所以我不能将这个事件用于我真正的海豚。

有一种方法可以根据弹出窗口包含的项目数“刷新”弹出窗口的大小,而无需关闭并重新打开它吗?

谢谢。

最佳答案

在包含组合框的面板上调用 revalidate()。这将导致组件根据其首选尺寸重新布局。

这与在可见 GUI 上添加/删除组件的概念相同。

编辑:

只需重读您的问题。我不确定您是否可以在打开时动态调整弹出窗口的大小,但您可以查看 Combo Box Popup .它向您展示了如何覆盖弹出窗口的首选宽度。当弹出菜单即将显示时执行此代码。但是您可以使用这些概念来访问弹出窗口并动态更改宽度。

编辑 2:

这是一个展示基本概念的例子。弹出窗口将每 2 秒调整一次宽度。但是,我不知道这是否有助于解决您的问题,因为如果您动态地从弹出窗口中添加/删除项目,那么每次更改弹出窗口时都需要重新创建弹出窗口。这可能会导致弹出窗口隐藏/显示,这意味着无论如何您都需要忍受一点点闪烁。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class ComboBoxExample extends JPanel implements ActionListener
{
    private JComboBox comboBox;

    public ComboBoxExample()
    {
        String[] petStrings = { "Select Pet", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Other" };
        comboBox = new JComboBox( petStrings );
        add( comboBox, BorderLayout.PAGE_START );

        Timer timer = new javax.swing.Timer(2000, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        comboBox.showPopup();
        Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
        BasicComboPopup popup = (BasicComboPopup)child;
        JList list = popup.getList();
        Container c = SwingUtilities.getAncestorOfClass(JScrollPane.class, list);
        JScrollPane scrollPane = (JScrollPane)c;

        Dimension size = scrollPane.getSize();

        if (size.width > 20)
            size.width -= 5;

        scrollPane.setPreferredSize(size);
        scrollPane.setMaximumSize(size);

        Dimension popupSize = popup.getSize();
        popupSize.width = size.width;
        Component parent = popup.getParent();
        parent.setSize(popupSize);

        parent.validate();
        parent.repaint();

        Window mainFrame = SwingUtilities.windowForComponent(comboBox);
        Window popupWindow = SwingUtilities.windowForComponent(popup);

        //  For heavy weight popups you need to pack the window

        if (popupWindow != mainFrame)
            popupWindow.pack();
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame( "ComboBoxExample" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        JComponent newContentPane = new ComboBoxExample();
        newContentPane.setOpaque( true );
        frame.setContentPane( newContentPane );
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

关于java - 如果我在项目可见时添加项目,则不会调整 JComboBox 弹出窗口的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058157/

相关文章:

android - 我想删除特定键中的长按模式弹出窗口

javascript - 页面转换后在 jQuery Mobile 1.4.3 中打开弹出窗口

java - R中的自定义距离度量,用于聚集聚类

java - JPA 查询不起作用

java - 在嵌入式 jar 中创建带有入口点的可执行 jar

java - 将 getResource() 用于 txt 文件 (Java) 的问题

java - 如何在 Swing 中仅绘制自定义控件的可见区域?

java - 读取字符串数组

java - 缩放和绘制 BufferedImage

javascript - 弹出位置问题