2012-06-21 13 views
10

"ユーザーがリストの下をクリックしたときにJListが最後の要素を選択しないようにする方法はありますか?JListがセル範囲外の選択をしないようにするにはどうすればいいですか?

これは誰かが尋ねた質問ですhereと私は同じ問題があります。その人は(processMouseEvent())をオーバーライドすることによってそうした解決策を見つけましたが、それを行うためのより良い/よりエレガントな方法があるかどうかを知りたいと思います。

[編集]

さらに詳しくは、 JListがあり、任意のセル/要素に占有されていないスペースがあり、そのスペースをクリックすると、JListの最後の要素が選択されます。

実際の例では、これを試してくださいJList Swing Tutorial exampleをクリックして、Rolloが選択されていることを確認してください。

+0

SOにISN」 (SSCCE)(http://sscce.org/)を投稿してください。さもなければ、私の答えは、あなたの質問が単純に「消費する」ように広いです。 – mKorbel

+0

@GuillaumePolet thnx、その様子を完全に見落とした – Alex

+0

@mKorbel simple例を追加 – Alex

答えて

16

コールスタックを見ると、あなたが本当にAWT-イベントいじりせずに、あなたがやりたいことができないhttps://forums.oracle.com/forums/thread.jspa?threadID=2206996

import java.awt.EventQueue; 
import java.awt.Point; 
import java.awt.Toolkit; 
import java.awt.event.InputEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 

public class TestJList { 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       JList list = new JList(new Object[] { "One", "Two", "Three" }) { 
        @Override 
        public int locationToIndex(Point location) { 
         int index = super.locationToIndex(location); 
         if (index != -1 && !getCellBounds(index, index).contains(location)) { 
          return -1; 
         } 
         else { 
          return index; 
         } 
        } 
       }; 

       list.addMouseListener(new MouseAdapter() { 

        @Override 
        public void mouseClicked(MouseEvent e) { 
         JList list = (JList) e.getSource(); 
         if (list.locationToIndex(e.getPoint()) == -1 && !e.isShiftDown() 
           && !isMenuShortcutKeyDown(e)) { 
          list.clearSelection(); 
         } 
        } 

        private boolean isMenuShortcutKeyDown(InputEvent event) { 
         return (event.getModifiers() & Toolkit.getDefaultToolkit() 
           .getMenuShortcutKeyMask()) != 0; 
        } 
       }); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(new JScrollPane(list)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

+1優れたコード、OTNの両方のポスターで、Swing APIの組み込み 'putClientProperty(...)のリストはどこですか? – mKorbel

+1

答えの下のKleopatraのコメントも読んでいます。選択をクリアするのに少し不便かもしれません。私の期待は何も起こらなかっただろう。以前に有効な選択をして(必ずしも最後のセルではない)、JListの外をクリックした場合、選択を保持し、クリアしない –

2

を参照してください。そして、あなたはあなた自身するListUIを実装することができ

Thread [AWT-EventQueue-0] (Suspended (breakpoint at line 384 in DefaultListSelectionModel)) 
    DefaultListSelectionModel.changeSelection(int, int, int, int, boolean) line: 384  
    DefaultListSelectionModel.changeSelection(int, int, int, int) line: 415 
    DefaultListSelectionModel.setSelectionInterval(int, int) line: 459 
    TestJList$1(JList<E>).setSelectionInterval(int, int) line: 2067 
    BasicListUI$Handler.adjustSelection(MouseEvent) line: 2739 
    BasicListUI$Handler.mousePressed(MouseEvent) line: 2695 
    AWTEventMulticaster.mousePressed(MouseEvent) line: 280 
    TestJList$1(Component).processMouseEvent(MouseEvent) line: 6502 
    TestJList$1(JComponent).processMouseEvent(MouseEvent) line: 3321  
    TestJList$1.processMouseEvent(MouseEvent) line: 24 
    TestJList$1(Component).processEvent(AWTEvent) line: 6270  
    TestJList$1(Container).processEvent(AWTEvent) line: 2229  
    TestJList$1(Component).dispatchEventImpl(AWTEvent) line: 4861 
    TestJList$1(Container).dispatchEventImpl(AWTEvent) line: 2287 
    TestJList$1(Component).dispatchEvent(AWTEvent) line: 4687 
    LightweightDispatcher.retargetMouseEvent(Component, int, MouseEvent) line: 4832 
    LightweightDispatcher.processMouseEvent(MouseEvent) line: 4489 
    LightweightDispatcher.dispatchEvent(AWTEvent) line: 4422  
    JFrame(Container).dispatchEventImpl(AWTEvent) line: 2273  
    JFrame(Window).dispatchEventImpl(AWTEvent) line: 2713 
    JFrame(Component).dispatchEvent(AWTEvent) line: 4687  
    EventQueue.dispatchEventImpl(AWTEvent, Object) line: 707  
    EventQueue.access$000(EventQueue, AWTEvent, Object) line: 101 
    EventQueue$3.run() line: 666  
    EventQueue$3.run() line: 664  
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]  
    ProtectionDomain$1.doIntersectionPrivilege(PrivilegedAction<T>, AccessControlContext, AccessControlContext) line: 76  
    ProtectionDomain$1.doIntersectionPrivilege(PrivilegedAction<T>, AccessControlContext) line: 87 
    EventQueue$4.run() line: 680  
    EventQueue$4.run() line: 678  

とあなたが望むものを(この望ましくない行動を防ぐことを含めて)行いますが、私はその道を踏み出すことを本当に勧めません。何が価値があるために

は、(それがprocessXXXEventメソッドをオーバーライドすることによって行われている)、ここで私が実際にその醜いない見つけるとその境界の外側をクリックしたときには、オブジェクトを選択しないように、小さなスニペットです:

import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class TestJList { 

    private JList list; 

    protected void initUI() { 
     JFrame frame = new JFrame("test"); 
     list = new JList(new Object[] { "Hello", "World", "!" }) { 

      private boolean processEvent(MouseEvent e) { 
       int index = list.locationToIndex(e.getPoint()); 
       return index > -1 && list.getCellBounds(index, index).contains(e.getPoint()); 
      } 

      @Override 
      protected void processMouseEvent(MouseEvent e) { 
       if (processEvent(e)) { 
        super.processMouseEvent(e); 
       } 
      } 

      @Override 
      protected void processMouseMotionEvent(MouseEvent e) { 
       if (processEvent(e)) { 
        super.processMouseMotionEvent(e); 
       } 
      } 
     }; 
     list.setVisibleRowCount(10); 

     frame.add(new JScrollPane(list)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestJList().initUI(); 
      } 
     }); 
    } 
} 
関連する問題