【问题标题】:Change JCombobox popup width [duplicate]更改JCombobox弹出宽度[重复]
【发布时间】:2014-01-08 12:21:45
【问题描述】:

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

我尝试的其中一件事是重写 getSize() 方法,但不起作用。

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);
    }
}

【问题讨论】:

  • 大小调整完成后不要忘记调用 pack() 弹出窗口
  • @StanislavL 我认为 Rob 也有很好的解决方法
  • 强制宽度的最简单方法是向setPrototypeDisplayValue 传递一个值,这不会让您以像素为单位指定确切的大小,但它更简洁,并且不是很好的 UI 实践无论如何设置组件的大小(以像素为单位)。
  • 似乎是重复的。另一个问题在我的示例中运行良好,但不是我的主要项目。似乎问题就在我这边。

标签: java swing layout jcombobox gridbaglayout


【解决方案1】:

这是解决方案,这对我有用,将此 PopupMenuListener 添加到您的 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);
}
}

来源:click here

【讨论】:

  • 你真的应该格式化你的代码
  • 好的。代码现在已格式化。
  • 这个解决方案在滚动条后给了我一个空格:imgur.com/WR8oi73
  • 在 PopupMenuListener 类中更改这些字段初始化:- private int bgTop = 0;私人int bgLeft = 0;私人 int bgRight = 0;私人int bgBottom = 0;这将解决您的问题。更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2011-12-10
  • 2023-03-11
  • 1970-01-01
  • 2011-06-05
  • 2012-01-28
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多