更改JCombobox弹出宽度 [英] Change JCombobox popup width

查看:98
本文介绍了更改JCombobox弹出宽度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何设置使用GridBagLayoutfill=HORIZONTALJComboboxs弹出菜单的固定宽度?

How can I set a fixed width of a JComboboxs popup-menu that is using GridBagLayout and fill=HORIZONTAL?

我尝试做的一件事就是只覆盖getSize()方法,但是不起作用.

One of the things I tried is to just override the getSize() method but dose not work.

public class ComboBoxSize extends JFrame {
    public static void main(String args[]) {

        // THE COMBOBOX
        String labels[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
        JComboBox<String> comboBox = new JComboBox<String>(labels) {
            public Dimension getSize() {
                Dimension d = getPreferredSize();
                d.width = 50;
                return d;
            }
        };
        comboBox.setMaximumRowCount(comboBox.getModel().getSize());

        // ADD COMBOBOX TO PANEL
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.weightx = 1;
        c.fill = GridBagConstraints.HORIZONTAL;
        panel.add(comboBox, c);

        // ADD PANEL TO FRAME
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

推荐答案

这是解决方案,对我有用,将此PopupMenuListener添加到您的JComboBox中:

Here is the solution, this worked for me, add this PopupMenuListener to your JComboBox:

import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.basic.ComboPopup;

public class CustomComboBoxPopupMenuListener implements PopupMenuListener {
    // ==============================================================================
    // Members
    // ==============================================================================
    private int bgTop = 0;
    private int bgLeft = 0;
    private int bgRight = 0;
    private int bgBottom = 0;

    // ==============================================================================
    // Constructors
    // ==============================================================================
    public CustomComboBoxPopupMenuListener() {
        super();
    }

    // ==============================================================================
    // Methods
    // ==============================================================================
    public void popupMenuCanceled(PopupMenuEvent e) {

    }

    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {

    }

    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
        final JComboBox box = (JComboBox) e.getSource();
        final Object comp = box.getUI().getAccessibleChild(box, 0);
        if (!(comp instanceof JPopupMenu)) {
            return;
        }
        final JPopupMenu popupMenu = (JPopupMenu) comp;
        popupMenu.setBorder(null);
        if (popupMenu.getComponent(0) instanceof JScrollPane) {
        final JScrollPane scrollPane = (JScrollPane) popupMenu
                .getComponent(0);
        scrollPane.setBorder(BorderFactory.createEmptyBorder(bgTop, bgLeft,
                bgBottom, bgRight));
        scrollPane.setOpaque(false);
        scrollPane.getViewport().setOpaque(false);
        if (popupMenu instanceof ComboPopup) {
            final ComboPopup popup = (ComboPopup) popupMenu;
            final JList list = popup.getList();
            list.setBorder(null);
            final Dimension size = list.getPreferredSize();
            size.width = Math.max(box.getPreferredSize().width + bgLeft
                    + bgRight, box.getWidth());
            size.height = Math.min(scrollPane.getPreferredSize().height
                    + bgTop + bgBottom, size.height + bgTop + bgBottom);
            scrollPane.setPreferredSize(size);
            scrollPane.setMaximumSize(size);
        }
    }
}
}

代码示例:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ComboBoxSize extends JFrame {
public static void main(String args[]) {

    // THE COMBOBOX
    String labels[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
    JComboBox<String> comboBox = new JComboBox<String>(labels);
    comboBox.setMaximumRowCount(comboBox.getModel().getSize());
    comboBox.addPopupMenuListener(new CustomComboBoxPopupMenuListener());
    // ADD COMBOBOX TO PANEL
    JPanel panel = new JPanel(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.weightx = 1;
    c.fill = GridBagConstraints.HORIZONTAL;
    panel.add(comboBox, c);

    // ADD PANEL TO FRAME
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(panel);
    frame.setSize(300, 200);
    frame.setVisible(true);
}
}

来源:单击此处

这篇关于更改JCombobox弹出宽度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆