Java 将鼠标位置分派到JList的自定义单元格渲染器中的组件

Java 将鼠标位置分派到JList的自定义单元格渲染器中的组件,java,swing,jlist,mousemove,listcellrenderer,Java,Swing,Jlist,Mousemove,Listcellrenderer,我正在为JList使用自定义cellrenderer,它为模型中的每个值创建一个JPanel 我想更改JPanel的一个组件的鼠标光标 但JList似乎没有将鼠标移动/位置发送给child,而且我的光标也没有更新 以下是我的JList目录树: JList Custom Cell Renderer Custom Cell (JPanel) Components My component with mouse cursor ch

我正在为JList使用自定义cellrenderer,它为模型中的每个值创建一个JPanel

我想更改JPanel的一个组件的鼠标光标

但JList似乎没有将鼠标移动/位置发送给child,而且我的光标也没有更新

以下是我的JList目录树:

JList
    Custom Cell Renderer
        Custom Cell (JPanel)
            Components
            My component with mouse cursor changed
如何设置JList分派鼠标位置

谢谢

编辑:一些代码:

public class JCOTSDisplay extends JList
{
    public JCOTSDisplay()
    {
        setCellRenderer(new COTSListCellRenderer());
        setModel(.....);
    }
}

public class COTSListCellRenderer implements ListCellRenderer
{
    @Override
    public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus)
    {
        return new JCOTSCell((COTS) value);
    }
}

public class JCOTSCell extends JPanel
{
    public JCOTSCell(final COTS cots)
    {
        initComponents();
    }

    private void initComponents()
    {
        JLabel lblUrl = new JLabel("<url>");
        lblUrl.setCursort(new Cursort(Cursor.HAND_CURSOR));
    }
}

您是否尝试在自定义单元格上使用方法?

好,因此JList仅显示,其行为类似于将组件渲染为图像,因此不会触发/调度任何鼠标侦听器/操作

我已经用一个JPanel替换了我的JList,该JPanel具有0行1列的GridLayout

我已经实例化了我的模型和单元渲染器,并像JList一样使用它们

现在一切都像我想的那样


谢谢。

如果我理解正确,您有一个项目列表,其中一些可能是超链接,您想要一个手动光标来显示这些项目吗?如@kleopatra所述,这些项目的装饰将由渲染器处理,但自定义光标将由JList上的侦听器处理

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("unchecked")
public class JListHoverDemo implements Runnable
{
  private JList jlist;
  private Cursor defaultCursor;

  public static void main(String args[])
  {
    SwingUtilities.invokeLater(new JListHoverDemo());
  }

  public void run()
  {
    Object[] items = new String[] {
        "One", "Two", "http://www.stackoverflow.com",
        "Four", "Five", "http://www.google.com", "Seven"
    };

    jlist = new JList(items);
    jlist.setCellRenderer(new HyperlinkRenderer());
    jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jlist.setVisibleRowCount(5);

    jlist.addMouseMotionListener(new MouseMotionAdapter()
    {
      @Override
      public void mouseMoved(MouseEvent event)
      {
        adjustCursor(event.getPoint());
      }
    });

    defaultCursor = jlist.getCursor();

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new JScrollPane(jlist));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  private void adjustCursor(Point point)
  {
    Cursor cursor = defaultCursor;
    int index = jlist.locationToIndex(point);

    if (index >= 0)
    {
      Object item = jlist.getModel().getElementAt(index);
      if (isHyperlink(item))
      {
        cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
      }
    }
    jlist.setCursor(cursor);
  }

  private boolean isHyperlink(Object item)
  {
    String text = item == null ? "" : item.toString();
    return text.startsWith("http");
  }

  private class HyperlinkRenderer extends DefaultListCellRenderer
  {
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean hasFocus)
    {
      Component comp = super.getListCellRendererComponent(
          list, value, index, isSelected, hasFocus);

      if (isHyperlink(value))
      {
        setFont(comp.getFont().deriveFont(Font.ITALIC));
        setForeground(Color.BLUE);
      }

      return comp;
    }
  }
}

你能发布一些代码吗?谢谢,我添加了代码示例。你不能-渲染组件不是容器层次结构的一部分。你想要实现什么?即使您在JList上更改给定位置的光标,评估鼠标位置并发送事件也不会产生任何效果。我想显示手动光标,因为JLabel正在显示url。顺便说一句,我希望能够在url上单击鼠标以打开浏览器。这是否意味着我不必使用JList?我在由GetListCellRenderComponent返回的JPanel内的JLabel上使用了setCursor方法,但如果没有luckno,则无法在渲染组件或更好的组件上设置光标:可以,但不会有任何效果-是的,它是这样工作的,但对于我的问题,它有点棘手,因为我的JList的每个元素都是一个JPanel,其中每个JPanel的一个组件都包含一个url,所以我必须检索单元渲染器使用的JPanel组件,并找到带有url的jlabel。到那时,我想在标签上添加一个单击侦听器,这是另一个问题。用面板和垂直布局替换jlist非常有效。谢谢