【问题标题】:Tooltip location in swing挥杆中的工具提示位置
【发布时间】:2011-08-28 17:57:46
【问题描述】:

我想显示 JList 中元素的工具提示。我为此使用setToolTipText(str)。我想要的是工具提示应该显示在该元素的右侧。我使用getToolTipLocation(mouseEvent),但无法获得想要的结果。我该怎么做?


更新

我的列表类:-

public class MyList extends JList {

    private static final long serialVersionUID = 2170990919011800182L;

    DefaultListModel model;

    public MyList(DefaultListModel model){
        super(model);
        this.model = model;
    }

    public Point getToolTipLocation(MouseEvent e) {
        return new Point(75, locationToIndex(e.getPoint()));
    }

    @Override
    public int getNextMatch(String prefix, int startIndex, Position.Bias bias) {
        if (prefix == null)
            throw new IllegalArgumentException("'prefix' must not be"
                    + " null.");
        if (startIndex < 0)
            throw new IllegalArgumentException("'startIndex' must not"
                    + " be less than zero.");

        if (startIndex >= model.getSize())
            throw new IllegalArgumentException("'startIndex' must not"
                    + " be greater than the number of"
                    + " elements.");

        int result = -1;
        int current = startIndex;
        int delta = -1;
        int itemCount = model.getSize();
        boolean finished = false;
        prefix = prefix.toUpperCase();

        if (bias == Position.Bias.Forward)
            delta = 1;
        while (!finished)
        {
            String itemStr = ((User) model.getElementAt(current)).getName().toString().toUpperCase();
            if (itemStr.indexOf(prefix)!=-1)
                return current;
            current = (current + delta);
            if (current == -1)
                current += itemCount;
            else
                current = current % itemCount;
            if(current == 0)
                finished = true;
            else                    
                finished = current == startIndex;
        }
        return result;
    }
}

我的渲染器类:-

public class MyRender extends JPanel implements ListCellRenderer {

    //--class vars
    public MyRender(Atalk atalk) {
        //--initialize class var
    }

    @Override
    public JComponent getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        //-- put vales in class vars and add them in JPanel
        setToolTipText(user.getName()+"<br/>"user.getAddress());
        return null;
    }
}

我声明列表的代码。

JList[] list = new JList[5];
DefaultListModel[] model = new DefaultListModel[5];
model[0] = new DefaultListModel();
list[0] = new MyList(model[0]);
model[1] = new DefaultListModel();
list[1] = new MyList(model[0]);
model[2] = new DefaultListModel();
list[2] = new MyList(model[0]);
model[3] = new DefaultListModel();
list[3] = new MyList(model[0]);
model[4] = new DefaultListModel();
list[4] = new MyList(model[0]);

【问题讨论】:

  • 你能在可见的 ViewPort 中确定 JList Item 的矩形吗(来自 JScrollPane)
  • @mKorbel:如何确定?
  • @Harry Joy:你看过我的回答了吗:)
  • @Damodar:是的,我做到了,但无法得到它。实际上,我知道所有这些事情,但我不知道如何将它们组合在一起以获得所需的结果。查看有问题的编辑。
  • 嗯,也许(并把你最后的线程放在一起)会更好地为 JList 添加 MouseMotionListener(Couponds JComponents),然后寻找一些 RolloverSupport(确定什么 JComponets 在 MouseCursor 下)和工具提示文本的 HashMap ,而且这个 ToolTip 是非常非常非常奇怪的组件

标签: java swing location tooltip jlist


【解决方案1】:

当您遇到问题时,发布您的http://sscce.org。 2 行代码并没有告诉我们你在做什么。

这是一个简单的 SSCCE:

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

public class ListToolTip extends JFrame
{
    public ListToolTip()
    {
        DefaultListModel model = new DefaultListModel();
        model.addElement("one");
        model.addElement("two");
        model.addElement("three");
        model.addElement("four");
        model.addElement("five");
        model.addElement("six");
        model.addElement("seven");
        model.addElement("eight");
        model.addElement("nine");
        model.addElement("ten");

        JList list = new JList( model )
        {
            public String getToolTipText( MouseEvent e )
            {
                int row = locationToIndex( e.getPoint() );
                Object o = getModel().getElementAt(row);
                return o.toString();
            }

            public Point getToolTipLocation(MouseEvent e)
            {
                int row = locationToIndex( e.getPoint() );
                Rectangle r = getCellBounds(row, row);
                return new Point(r.width, r.y);
            }
        };

        JScrollPane scrollPane = new JScrollPane( list );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        ListToolTip frame = new ListToolTip();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.setSize(400, 100);
        frame.setVisible( true );
    }
}

【讨论】:

  • @Harry Joy,你看我的评论了吗?您尚未发布 SSCCE。你的更新对我来说毫无意义。我给了你工作代码。如果它不完全符合您的要求,请对其进行定制以满足您的要求。
猜你喜欢
  • 2012-02-08
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
相关资源
最近更新 更多