【问题标题】:Dynamic JComboBox Size动态 JComboBox 大小
【发布时间】:2015-03-17 22:52:54
【问题描述】:

我有一个JComboBox,由于它包含的Strings 很长,它占用了我的GUI 太多空间。我只需要在选择时查看它们的全长。所以,我希望 JComboBox 只有在那时才为全尺寸,否则更短。

以下代码似乎有效。但是,由于我是 Java 新手,我只是想知道是否有更好或更标准的方法来做到这一点。

谢谢。

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

public class DynamicJComboBox{
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setLayout(new FlowLayout());
        frame.setSize(250, 100);

        JComboBox box = new JComboBox();
        box.addItem("Really Long Line Number One");
        box.addItem("Really Long Line Number Two");
        box.addItem("Really Long Line Number Three");
        box.addItem("Really Long Line Number Four");
        box.setPreferredSize(new Dimension(100, 30));
        box.addPopupMenuListener (new PopupMenuListener() {
            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {}

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                box.setSize(100,30);
            }
            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                box.setSize(200,30);    
            }
        });
        frame.add(box);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception exc) {}

        SwingUtilities.invokeLater(() -> {
        createAndShowGUI();
        });
    }
}

【问题讨论】:

    标签: java swing user-interface dynamic jcombobox


    【解决方案1】:

    下面的代码似乎可以工作

    并不是因为您更改了组合框的大小,这会导致组合框覆盖其右侧的任何组件显示。此外,组合框箭头绘制在组合框的中间。

    查看Combo Box Popup。该解决方案还使用了 PopupMenuListener(因此您在正确的轨道上),但它只会在显示时增加弹出窗口的宽度,而不是组合框。

    【讨论】:

    • 有趣的是,你提到的问题并没有在我的实际 GUI 中发生,只是在我在这里发布的精简版本中发生。但是,我还是改用了你的建议,因为它更灵活。谢谢。
    • 只是为了自己的学习经验,为什么popupMenuWillBecomeVisible重新安排customizePopup方法运行在Swing事件线程上?我原以为popupMenuWillBecomeVisible 已经在这个线程上运行了。
    • @GregValvo,是的,它正在 EDT 上运行。在这种情况下,我不记得具体情况,但问题可能是由于菜单实际上不可见,因此尺寸尚不清楚,所以我需要确保在确定尺寸后执行代码,所以我可以覆盖它们。 invokeLater() 将自定义代码添加到 EDT 的末尾。
    【解决方案2】:

    即使组合框的大小可能更小,小技巧也能让弹出菜单的大小足够大以显示项目

    来源:http://www.jroller.com/santhosh/entry/make_jcombobox_popup_wide_enough

        import java.awt.Dimension;
        import java.util.Vector;
    
        import javax.swing.ComboBoxModel;
        import javax.swing.JComboBox;
    
        public class ComboBoxFullMenu<E> extends JComboBox<E> {
    
            public ComboBoxFullMenu(E[] items) {
                super(items);
                addActionListener(this);
            }
    
            public ComboBoxFullMenu(Vector<E> items) {
                super(items);
                addActionListener(this);
            }
    
            public ComboBoxFullMenu(ComboBoxModel<E> aModel) {
                super(aModel);
                addActionListener(this);
            }
    
            /**
             * Small hack to get pop up menu size bigger enough to show items even though
             * the combo box size could be smaller
             * */
            private boolean layingOut = false; 
    
            @Override
            public void doLayout(){ 
                try{ 
                    layingOut = true; 
                    super.doLayout(); 
                }finally{ 
                    layingOut = false; 
                } 
            } 
    
            @Override
            public Dimension getSize(){ 
                Dimension dim = super.getSize(); 
                if ( !layingOut ) {
                    dim.width = Math.max(dim.width, getPreferredSize().width);
                }
                return dim; 
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      相关资源
      最近更新 更多