Java 将鼠标位置分派到JList的自定义单元格渲染器中的组件
我正在为JList使用自定义cellrenderer,它为模型中的每个值创建一个JPanel 我想更改JPanel的一个组件的鼠标光标 但JList似乎没有将鼠标移动/位置发送给child,而且我的光标也没有更新 以下是我的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
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非常有效。谢谢