1

JListcustom に接続されているがDefaultListModelあり、コンポーネントのいくつかの値でマウス カーソルを変更したいと思います (アイテム/値のタイプによって異なります)。一部のアイテムではデフォルトのカーソルにする必要があり、他のアイテムではハンドカーソルにする必要があります。

私は自分のカスタムでこれを行うことができると思ったDefaultListCellRenderer:

@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

    MyItem item = (MyItem) value;
    setText(item.getDisplay());

    if (!item.getType().equals("i"))
        setCursor(new Cursor(Cursor.HAND_CURSOR)); // <-- doesn’t work

    return this;
}

私のアプローチはうまくいきません。正しい方法でそれを行う方法はありますか?

4

1 に答える 1

2

一部のセルをターゲットにする場合は、カーソルを手動で更新する必要があります。以下に小さな例を示します。

public static void main ( String[] args )
{
    final JFrame frame = new JFrame ();

    final JList list = new JList (
            new Object[]{ Cursor.DEFAULT_CURSOR, Cursor.CROSSHAIR_CURSOR, Cursor.TEXT_CURSOR,
                    Cursor.WAIT_CURSOR, Cursor.SW_RESIZE_CURSOR, Cursor.SE_RESIZE_CURSOR,
                    Cursor.NW_RESIZE_CURSOR, Cursor.NE_RESIZE_CURSOR, Cursor.N_RESIZE_CURSOR,
                    Cursor.S_RESIZE_CURSOR, Cursor.W_RESIZE_CURSOR, Cursor.E_RESIZE_CURSOR,
                    Cursor.HAND_CURSOR, Cursor.MOVE_CURSOR } );

    list.setCellRenderer ( new DefaultListCellRenderer ()
    {
        public Component getListCellRendererComponent ( JList list, Object value, int index,
                                                        boolean isSelected,
                                                        boolean cellHasFocus )
        {
            JLabel label = ( JLabel ) super
                    .getListCellRendererComponent ( list, value, index, isSelected,
                            cellHasFocus );
            label.setText ( "Cursor constant: " + value );
            return label;
        }
    } );

    list.addMouseMotionListener ( new MouseMotionListener ()
    {
        public void mouseDragged ( MouseEvent e )
        {
            updateCursor ( e );
        }

        public void mouseMoved ( MouseEvent e )
        {
            updateCursor ( e );
        }

        private void updateCursor ( MouseEvent e )
        {
            int cursor = ( Integer ) list.getModel ()
                    .getElementAt ( list.locationToIndex ( e.getPoint () ) );
            list.setCursor ( Cursor.getPredefinedCursor ( cursor ) );
        }
    } );

    frame.add ( list );

    frame.pack ();
    frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}
于 2012-09-24T15:57:06.350 に答える