5

データの配列を渡してJListを作成します

public class MyJList extends JList() {
...

   public MyJList(final Object[] listData) {
       super[listData];
   }

このリストは、各アイテムのコンポーネントを提供するListCellRendererを使用してレンダリングします。これは、ビジネスロジックに従って有効または無効にできます。

キーボードの矢印でナビゲートしようとすると、問題が発生します。無効にしたアイテムをスキップしたい。(適切な方向で次の項目に進みます)リストで選択されている項目に応じてUIが変わるため、KeyboardListenerを使用する必要があります。問題は、キーボードリスナーで、選択したインデックスを持つアイテムのコンポーネントを取得できないことです。このコンポーネントはJListによって所有されておらず、MyJList.getComponent(index)の呼び出しはArrayIndexOutOfBoundsExceptionで失敗します。1はインデックスが大きすぎますが、7つのアイテムが表示され、そのうち4つが有効になっています。

JListからインデックスによってコンポーネントをプログラムで取得して、それが有効になっているかどうかを判断するにはどうすればよいですか?コンポーネントを返すように見える唯一のインターフェースはgetListCellRendererComponent()です-これはコンポーネントの表示を変更します。コンポーネントを取得して、有効になっているかどうかを確認したいだけです。

4

1 に答える 1

6

にはJListコンポーネントが含まれていません。レンダラーによって返されるコンポーネントはスタンプとしてのみ使用され、実際にはに含まれていませんJList

これについては、テーブルチュートリアルの「レンダラーとエディター」セクションで説明されています。表について説明していますが、JListsにも当てはまります。

特定のインデックスの「コンポーネント」を取得する場合は、レンダラーを使用してコンポーネントを要求するだけです。この例は、JList#getTooltipText:のソースコードで見ることができます。

public String getToolTipText(MouseEvent event) {
    if(event != null) {
        Point p = event.getPoint();
        int index = locationToIndex(p);
        ListCellRenderer<? super E> r = getCellRenderer();
        Rectangle cellBounds;

        if (index != -1 && r != null && (cellBounds =
                           getCellBounds(index, index)) != null &&
                           cellBounds.contains(p.x, p.y)) {
            ListSelectionModel lsm = getSelectionModel();
            Component rComponent = r.getListCellRendererComponent(
                       this, getModel().getElementAt(index), index,
                       lsm.isSelectedIndex(index),
                       (hasFocus() && (lsm.getLeadSelectionIndex() ==
                                       index)));

            if(rComponent instanceof JComponent) {
                MouseEvent      newEvent;

                p.translate(-cellBounds.x, -cellBounds.y);
                newEvent = new MouseEvent(rComponent, event.getID(),
                                          event.getWhen(),
                                          event.getModifiers(),
                                          p.x, p.y,
                                          event.getXOnScreen(),
                                          event.getYOnScreen(),
                                          event.getClickCount(),
                                          event.isPopupTrigger(),
                                          MouseEvent.NOBUTTON);

                String tip = ((JComponent)rComponent).getToolTipText(
                                          newEvent);

                if (tip != null) {
                    return tip;
                }
            }
        }
    }
    return super.getToolTipText();
}
于 2012-09-11T20:55:05.080 に答える