2011-06-05 20 views
4

基本上是其衍生的JTextField下面顯示的JComboBox彈出,如何從怒吼取向爲JcomboBox的彈出改變方向並在頂/顯示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; 
     } 
    } 
} 

回答

2

在我的系統,一個JComboBox將向上打開,如果它是靠近屏幕的底部,並沒有足夠的空間向下打開。 (這是你的意思嗎?)

鑑於這個事實,我懷疑這很容易改變定義的行爲。

+0

我(的JPanel,BorderLayout.SOUTH)爲狀態欄funkcionalities這是包含的JComboBox和我 「想」 換行/粘JcomboBox的內JFrame的彈出:-) – mKorbel 2011-06-05 11:10:04

2

在Mac OS X上,我收到以下異常。顯然,com.apple.laf.AquaComboBoxRenderer不是BasicComboBoxRenderer的子類。

增編:ClassCastException走了,和 「編輯第二代碼爲MacOX」 的屏幕截圖顯示如下:

enter image description here

 
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
    com.apple.laf.AquaComboBoxRenderer cannot be cast to 
    javax.swing.plaf.basic.BasicComboBoxRenderer 
    at HighRowCombo.makeUI(HighRowCombo.java:26) 
    at HighRowCombo$1.run(HighRowCombo.java:13) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:678) 
    at java.awt.EventQueue.access$000(EventQueue.java:86) 
    at java.awt.EventQueue$1.run(EventQueue.java:639) 
    at java.awt.EventQueue$1.run(EventQueue.java:637) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:648) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+1

(嘆氣)的Mac。 - 敢於與衆不同。 ;) – 2011-06-05 16:19:20

+0

需要Mac OS X的問題(總是)擴展MetalXxxXxx? – mKorbel 2011-06-05 17:20:32

+0

@mKorbel:AFAIK,'MetalLookAndFeel'始終可用。我有時會使用[在這裏]看到的方法(以下簡稱爲「借用」)(http://stackoverflow.com/questions/6236998/jslider-go-to-clicked-position-problem-only-on-macintosh/6238251#6238251)來自另一個L&F的元素(例如圖標)。 – trashgod 2011-06-05 18:03:47

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