我正在为JList使用自定义cellrenderer,为模型中的每个值创建一个JPanel。
我想更改JPanel的一个组件的鼠标光标。
但似乎JList没有向孩子发送鼠标移动/位置,我的光标也没有更新。
这是我的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));
}
}
答案 0 :(得分:0)
好的,所以JList是仅显示,它的行为就像组件呈现为图像一样,因此不会触发/调度任何鼠标listerner / actions。
我已经用一个带有0行和1列GridLayout的JPanel替换了我的JList。
我已经实例化了我的模型和我的单元格渲染器,并像JList一样使用它们。
现在一切都像我想要的那样。
感谢。
答案 1 :(得分:0)
如果我理解正确,你有一个项目的JList,其中一些可能是超链接,你只想要这些项目的HAND光标?如上所述@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;
}
}
}
答案 2 :(得分:-1)
您是否尝试在自定义单元格中使用方法setCursor?