2009-01-26 7 views

Répondre

20

Il existe une bien meilleure façon de procéder que la réponse ToolTipComboBox déjà donnée.

Tout d'abord, faire une coutume 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; 
    } 
} 

utiliser ensuite comme ceci:

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

Je ne l'ai jamais essayé, mais vous devriez être capable de définir un ListCellRenderer, et de lui renvoyer un JLabel ou autre avec une info-bulle.

3

code fixe est ici peu d'une example en ligne:

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

Si votre zone de liste déroulante n'est pas modifiable, utilisez setRenderer(ListCellRenderer). Si elle est modifiable, utilisez setEditor(ComboBoxEditor), parce que:

Le moteur de rendu est utilisé si le JComboBox n'est pas modifiable. S'il est modifiable, l'éditeur est utilisé pour afficher et modifier l'élément sélectionné.

7

J'aime la simplicité de la solution de MountainX mais pas le manque d'encapsulation. Une solution alternative qui a plus de pièces mobiles, mais elles sont assez simples et réutilisables.

Interface:

public interface ToolTipProvider { 
    public String getToolTip(); 
} 

Une classe d'emballage:

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

} 

Et une variante du moteur de rendu de 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; 
    } 
} 

avec l'ajout d'aujourd'hui:

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