1

現在、私は次のようJlistな習慣を持ってCellRendererいます。MouseListenerホバー イベントと、後でダブルクリック イベントをキャプチャするために、カスタムをアタッチしました。しかし、この方法で追加したときにイベントが発生していませんでした。20 分後JList、イベントが個々のリスト項目に到達するのをブロックしていたことが原因であることがわかりました。JListマウスイベントをその子要素に強制的に転送する方法はありますか、またはこれを行うより良い方法はありますか?

私のCellRenderer:

public class FriendRenderer extends DefaultListCellRenderer {

    private static final long serialVersionUID = 1L;

    public Component getListCellRendererComponent(JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean hasFocus) {

        Friend friend = (Friend)value;

        JLabel label = new JLabel(friend.getName());

        JPanel mainOuterPanel = new JPanel();
        mainOuterPanel.setLayout(new BorderLayout());

        /* Adding components to mainOuterPanel... */

        /* Here is where I add the custom MouseListener */
        mainOuterPanel.addMouseListener(new ListItemMouseListener());

        return(mainOuterPanel);
    }

}

私のマウスリスナー:

public class ListItemMouseListener implements MouseListener{

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {
        Component source = e.getComponent();
        source.setBackground(new Color(102, 99, 86));
        System.out.println("Mouse entered on " + source.toString());
    }

    @Override
    public void mouseExited(MouseEvent e) {
        Component source = e.getComponent();
        source.setBackground(null);
        System.out.println("Mouse Exited on " + source.toString());
    }
}

JFrame で JList を作成する場所:

private JList getFriendsList(){
    friendsList = new JList(getFriendsListModel()); //TODO Actually fill with data
    friendsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    friendsList.setLayoutOrientation( JList.VERTICAL );
    friendsList.addListSelectionListener(new FriendsListSelectionListener());
    friendsList.setCellRenderer(new FriendRenderer());
    return friendsList;
}

前もって感謝します!

4

1 に答える 1

3

リスナをリストに追加し、リスト メソッドを使用してポイントを行に変換します。

レンダラーに追加しても機能しない理由は、レンダーが実際には..レンダリングにのみ使用されるためです。これは、アイテムが画面に表示される前に、リスト アイテム (および他のすべての表示可能なリスト アイテム) を描画するために使用される「テンプレート」のようなものです。


..セルにアクセスして..背景を変更する..

ListCellRendererそれを処理するように を設定します。

于 2012-06-09T08:17:09.133 に答える