2009-01-26 19 views

回答

20

有一個好得多的方法來做到這一點比已經給出的ToolTipComboBox答案。

首先,創建一個自定義ListCellRenderer

package com.example; 

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

public class ComboboxToolTipRenderer extends DefaultListCellRenderer { 
    List<String> tooltips; 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
         int index, boolean isSelected, boolean cellHasFocus) { 

     JComponent comp = (JComponent) super.getListCellRendererComponent(list, 
       value, index, isSelected, cellHasFocus); 

     if (-1 < index && null != value && null != tooltips) { 
      list.setToolTipText(tooltips.get(index)); 
     } 
     return comp; 
    } 

    public void setTooltips(List<String> tooltips) { 
     this.tooltips = tooltips; 
    } 
} 

然後使用它是這樣的:

JComboBox comboBox = new JComboBox(); 
ComboboxToolTipRenderer renderer = new ComboboxToolTipRenderer(); 
comboBox.setRenderer(renderer); 
... 
//make a loop as needed 
comboBox.addItem(itemString); 
tooltips.add(tooltipString); 
... 
renderer.setTooltips(tooltips); 
1

我從來沒有嘗試過,但你應該能夠定義一個ListCellRenderer,並讓它返回一個JLabel或任何帶有工具提示的東西。

3

這裏的點點從網上example固定碼:

import java.awt.Component; 
import java.awt.FlowLayout; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.UIManager; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 

/** 
* @version 1.0 06/05/99 
*/ 
public class ToolTipComboBox extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 2939624252688908292L; 

String[] items = { "jw", "ja", "la" }; 

    String[] tooltips = { "Javanese ", "Japanese ", "Latin " }; 

    public ToolTipComboBox() { 
    super("ToolTip ComboBox Example"); 

    JComboBox combo = new JComboBox(items); 
    combo.setRenderer(new MyComboBoxRenderer()); 

    getContentPane().setLayout(new FlowLayout()); 
    getContentPane().add(combo); 
    } 

    class MyComboBoxRenderer extends BasicComboBoxRenderer { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 2746090194775905713L; 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
     if (isSelected) { 
     setBackground(list.getSelectionBackground()); 
     setForeground(list.getSelectionForeground()); 
     if (-1 < index) { 
      list.setToolTipText(tooltips[index]); 
     } 
     } else { 
     setBackground(list.getBackground()); 
     setForeground(list.getForeground()); 
     } 
     setFont(list.getFont()); 
     setText((value == null) ? "" : value.toString()); 
     return this; 
    } 
    } 

    public static void main(String args[]) { 
    try { 
     UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
    } catch (Exception evt) {} 

    ToolTipComboBox frame = new ToolTipComboBox(); 
    frame.addWindowListener(new WindowAdapter() { 
     @Override 
    public void windowClosing(WindowEvent e) { 
     System.exit(0); 
     } 
    }); 
    frame.setSize(200, 140); 
    frame.setVisible(true); 
    } 
} 
3

如果你的組合框不可編輯,使用setRenderer(ListCellRenderer)。如果它是可編輯的,則使用setEditor(ComboBoxEditor),因爲:

如果JComboBox不可編輯,則使用渲染器。如果它是可編輯的,則編輯器用於渲染和編輯選定的項目。

7

我喜歡MountainX的解決方案的簡單但又不缺乏封裝。另一種解決方案具有更多移動部件,但它們非常簡單且可重複使用。

接口:

public interface ToolTipProvider { 
    public String getToolTip(); 
} 

包裝類:

public class ToolTipWrapper implements ToolTipProvider { 
    final Object value; 
    final String toolTip; 

    public ToolTipWrapper(Object value, String toolTip) { 
     this.value = value; 
     this.toolTip = toolTip; 
    } 

    @Override 
    public String getToolTip() { 
     return toolTip; 
    } 

    @Override 
    public String toString() { 
     return value.toString(); 
    } 

} 

而且MountainX的渲染器的變體:

public class ToolTipRenderer extends DefaultListCellRenderer { 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 
     JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, 
       cellHasFocus); 
     String tip = null; 
     if (value instanceof ToolTipProvider) { 
      ToolTipProvider ttp = (ToolTipProvider) value; 
      tip = ttp.getToolTip(); 
     } 
     list.setToolTipText(tip); 
     return component; 
    } 
} 

與現在加:

combobox.addItem(new ToolTipWrapper(itemString,tooltipString));