【问题标题】:JComboBox change drop-down popupJComboBox 更改下拉弹出框
【发布时间】:2011-09-08 16:45:47
【问题描述】:

基本上是JComboBox的弹出窗口,显示在其派生的JTextField下方,如何从JComboBox弹出窗口的波纹方向改变方向并在顶部/上方显示JComboBox的弹出窗口

编辑:基本 JComboBox 的代码示例

import java.awt.Dimension;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboBoxRenderer;

public class HighRowCombo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new HighRowCombo().makeUI();
            }
        });
    }

    public void makeUI() {
        Object[] data = {"One", "Two with text", "Three with long text, with long text,with long text "};
        JComboBox comboBox = new JComboBox(data);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.add(comboBox);
        frame.pack();
        BasicComboBoxRenderer renderer = (BasicComboBoxRenderer) comboBox.getRenderer();
        Dimension size = renderer.getPreferredSize();
        size.height += 50;
        renderer.setPreferredSize(size);
        frame.setVisible(true);
    }
}

编辑第二。 MacOX 的代码

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

public class TestHighRow {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                new TestHighRow().makeUI();
            }
        });
    }

    public void makeUI() {
        Object[] data = {"One", "Two", "Three"};
        JComboBox comboBox = new JComboBox(data);
        comboBox.setPreferredSize(comboBox.getPreferredSize());
        comboBox.setRenderer(new HighRowRenderer(comboBox.getRenderer()));
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(comboBox);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static class HighRowRenderer implements ListCellRenderer {

        private final ListCellRenderer delegate;
        private int height = -1;

        public HighRowRenderer(ListCellRenderer delegate) {
            this.delegate = delegate;
        }

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Component component = delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            Dimension size = component.getPreferredSize();
            if (height == -1) {
                height = size.height + 50;
            }
            size.height = height;
            component.setPreferredSize(size);
            if (component instanceof JLabel) {
                ((JLabel) component).setHorizontalTextPosition(JLabel.CENTER);
            }
            return component;
        }
    }
}

【问题讨论】:

    标签: java swing drop-down-menu popup jcombobox


    【解决方案1】:

    尝试Combo Box Popup 中的 setPopupAbove() 方法。

    【讨论】:

      【解决方案2】:

      在我的系统上,如果JComboBox 靠近屏幕底部并且没有足够的空间向下打开它,它将向上打开。 (这是你的意思吗?)

      鉴于这一事实,我怀疑改变定义的行为会很容易。

      【讨论】:

      • 我有 (JPanel, BorderLayout.SOUTH) 用于包含 JComboBox 的 StatusBar funkcionalities 并且我“想要”将 JComboBox 的弹出窗口包装/粘贴到 JFrame 中:-)
      【解决方案3】:

      在 Mac OS X 上,我得到以下异常。显然,com.apple.laf.AquaComboBoxRenderer 不是BasicComboBoxRenderer 的子类。

      附录:ClassCastException 不见了,下面出现了“EDIT 2nd. Code for MacOX”的屏幕截图:

      线程“AWT-EventQueue-0”java.lang.ClassCastException 中的异常: com.apple.laf.AquaComboBoxRenderer 无法转换为 javax.swing.plaf.basic.BasicComboBoxRenderer 在 HighRowCombo.makeUI(HighRowCombo.java:26) 在 HighRowCombo$1.run(HighRowCombo.java:13) 在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:678) 在 java.awt.EventQueue.access$000(EventQueue.java:86) 在 java.awt.EventQueue$1.run(EventQueue.java:639) 在 java.awt.EventQueue$1.run(EventQueue.java:637) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:648) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

      【讨论】:

      • (叹气)麦克。 - 敢于与众不同。 ;)
      • @mKorbel:AFAIK,MetalLookAndFeel 始终可用。我有时会使用here 所见的方法,以便从另一个 L&F 中“借用”一个元素,例如图标。
      • 已移除并替换为 ListCellRenderer
      • @mKorbel: EDIT 2nd 看起来不错;我在上面添加了一个屏幕截图。
      【解决方案4】:
      package com.example.swing;
      
      import javax.swing.JList;
      import javax.swing.ListCellRenderer;
      import java.awt.Component;
      import java.awt.Dimension;
      
      public class PaddingListCellRenderer<Type> implements ListCellRenderer<Type> {
          private final ListCellRenderer original;
          private final int hpadding;
          private final int vpadding;
      
          public PaddingListCellRenderer(ListCellRenderer original, int hpadding, int vpadding) {
              this.original = original;
              this.hpadding = hpadding;
              this.vpadding = vpadding;
          }
      
          @Override
          @SuppressWarnings("unchecked")
          public Component getListCellRendererComponent(JList<? extends Type> list, Type value, int index, boolean isSelected, boolean cellHasFocus) {
              final Component component = original.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
              component.setPreferredSize(null);
              final Dimension pref = component.getPreferredSize();
              component.setPreferredSize(new Dimension(pref.width + 2 * hpadding, pref.height + 2 * vpadding));
              return component;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 2011-12-20
        相关资源
        最近更新 更多