【问题标题】:Java Swing: Mouseover text on JComboBox items?Java Swing:JComboBox 项目上的鼠标悬停文本?
【发布时间】:2009-01-26 15:55:09
【问题描述】:

在 Swing 中,有没有办法为 JComboBox 中的每个项目定义鼠标悬停文本(或工具提示文本)?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    有一个比已经给出的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);
    

    【讨论】:

    • 如何设置tooltip的位置?如果列表上的工具提示像工具提示一样浮动在光标下方的某处,则它没有多大意义。工具提示应出现在与列表项相同的 y 位置。知道如何实现这一目标吗?
    • 我使用了这个解决方案并观察到一个缺陷,如果组合框包含一个空字符串。在这种情况下,对应的线几乎是不可见的(2 像素)。当我存储 JComboBox 的原始渲染器并调用 originalRenderer.getListCellRendererComponent(...) 而不是 super.getListCellRendererComponent(...) 时,问题就消失了。
    • @micro:在我的应用程序中,图片显示为工具提示,因此我不能依赖 setToolTipText 并且必须自己实现工具提示机制,包括位置问题。它是通过 MouseInfo.getPointerInfo().getLocation() 和添加到 JList 中的合适的 MouseAdapter 来解决的。
    【解决方案2】:

    我喜欢 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) );
    

    【讨论】:

      【解决方案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);
        }
      }
      

      【讨论】:

      • 如何设置tooltip的位置?如果列表上的工具提示像工具提示一样浮动在光标下方的某处,则它没有多大意义。工具提示应出现在与列表项相同的 y 位置。知道如何实现这一目标吗?
      【解决方案4】:

      如果您的组合框不可编辑,请使用setRenderer(ListCellRenderer)。如果可以编辑,请使用setEditor(ComboBoxEditor),因为:

      如果 JComboBox 不可编辑,则使用渲染器。如果它是可编辑的,则使用编辑器来渲染和编辑选定的项目。

      【讨论】:

        【解决方案5】:

        我从未尝试过,但您应该能够定义一个 ListCellRenderer,并让它返回一个 JLabel 或任何带有工具提示的东西。

        【讨论】:

          猜你喜欢
          • 2018-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-20
          • 2022-01-06
          • 1970-01-01
          相关资源
          最近更新 更多