2013-08-06 47 views
-1

我一個JList,在一些面板層次,我沒有能夠突破關鍵UPDOWN改變選擇事件,並注意到,我沒有得到任何的按鍵事件我JList,所以我就開始調查加上幾行我Swing層次的重點管理:爲什麼我的JList獲得臨時焦點?

mJList.addFocusListener(new FocusListener() { 

    @Override 
    public void focusLost(FocusEvent e) { 
     System.out.println("focusLost to "+e.getOppositeComponent()); 
     //mJList.requestFocus(); 
    } 

    @Override 
    public void focusGained(FocusEvent e) { 
     System.out.println("focusGained"); 
    } 
}); 

在開始的時候,我發現我的一些按鈕分別獲得焦點幾毫秒後,我的JList獲得它,所以我做了所有這些按鈕unfocusable,和然後我得到這個奇怪的結果,我的JList正在失去焦點... null?!?!

focusGained 
focusLost to null 

然後我添加了被註釋掉的focusLost方法來恢復時,它會丟失重點線,但我相信它的長項非常糟糕的解決方案,所以我的問題是:

  1. 爲什麼我的JList只能得到時間焦點,如果不是這樣的話,那麼爲什麼它會被迫放棄null
  2. 如何解決它在一個適當的(良好做法)的方式?
+0

爲什麼不使用[鍵綁定(http://docs.oracle.com/javase/tutorial/uiswing/misc /keybinding.html)?這並不一定強調像'KeyListener'這樣的相關問題。這篇文章關於[Motion Using Keyboard](http://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/),可以讓您更深入地瞭解每種方法,@camickr :-) –

回答

1

請你能解釋一下你的問題在這個SSCCE,否則發表您自己的

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Testing extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private DefaultListModel listModel = new DefaultListModel(); 
    private JList list = new JList(listModel); 
    private JScrollPane sp = new JScrollPane(list); 
    private JButton btn1 = new JButton("Reset Model with freeze"); 
    private JButton btn2 = new JButton("Reset Model with change selection"); 
    private int xX = 0; 

    public Testing() { 
     for (int x = 0; x < 19; x++) { 
      listModel.addElement("" + x); 
      xX++; 
     } 
     btn1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       listModel.removeAllElements(); 
       // caused locking GUI for long time in the case 
       // that Item count is more than 999 Items 
       for (int x = 0; x < 19; x++) { 
        listModel.addElement("" + (x + xX)); 
        xX++; 
       } 
      } 
     }); 
     btn2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       //list.clearSelection(); 
       if (list.getSelectedIndex() == 0) { 
        list.setSelectedIndex(1); 
       } 
       listModel.removeAllElements(); 
       for (int x = 0; x < 19; x++) { 
        listModel.addElement("" + (x + xX)); 
        xX++; 
       } 
       list.setSelectedIndex(0); 
      } 
     }); 
     add(sp, BorderLayout.CENTER); 
     add(btn1, BorderLayout.NORTH); 
     add(btn2, BorderLayout.SOUTH); 
     setLocation(400, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       list.setSelectedIndex(0); 
      } 
     }); 
     list.addFocusListener(new FocusListener() { 
      @Override 
      public void focusLost(FocusEvent e) { 
       System.out.println("focusLost to " + e.getOppositeComponent()); 
       //mJList.requestFocus(); 
      } 

      @Override 
      public void focusGained(FocusEvent e) { 
       System.out.println("focusGained"); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Testing().setVisible(true); 
      } 
     }); 
    } 
} 
+0

我有太多的圖形和我的項目中的面板非常大的層次結構,所以我不能真正產生一個SSCCE,並且您的SSCE不重現我正在談論的內容... –

+0

@OfekRon它是_您的job_找到錯誤 - SSCCE是將您引導至解決方案的有效方式,無論您自己找到還是有人可以幫助您。沒有,沒有辦法回答你的問題。 – kleopatra

+0

@Ofek Ron然後你的回答是不應答的,我的意圖是放在那裏普通的focus_recycle沒有陰影消費者,野生的黑暗--->刪除/禁用setFocusable的所有設置(true/false) – mKorbel

相關問題