2012-04-24 23 views
7

Tôi có mã số JCombobox trong mã của mình. Tôi đã thêm FocusLost event. Nhưng dù sao nó cũng không bắn. Tôi đã thử rất nhiều thời gian nhưng không tìm được giải pháp.Tiêu điểm JComboboxĐầu tiên không phải là lý do tại sao?

jcbItemType.addFocusListener(new java.awt.event.FocusAdapter() { 
    public void focusLost(java.awt.event.FocusEvent evt) { 
     jcbItemTypeFocusLost(evt); 
    } 
}); 

private void jcbItemTypeFocusLost(java.awt.event.FocusEvent evt)          
    {           
     // TODO add your handling code here: 
     System.out.println("name=" + ((Component) evt.getSource()).getName()); 
     System.out.println("index=" + jcbItemType.getSelectedIndex()); 
    } 

Nhưng không có gì được in trong bảng điều khiển. Xin cho tôi biết tôi đang làm gì sai.

Trả lời

6
  • FocusListener không phải là thích hợp cho Listener JComboBox, hoàn toàn với một vòng lặp vô tận Listener(s) có thể tạo ra (đặc biệt là Editable JComboBox),

  • FocusListener là không đồng bộ, đôi khi là quá khó để nắm bắt các sự kiện là các đơn đặt hàng đặc biệt đúng trong các trường hợp JComponents đã thêm một số khác Listener(s) quá

ví dụ cách nghe Focus từ nguồn gốc JTextField/JFormattedTextField

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

public class ComboBoxTwo extends JFrame implements ItemListener { 

    private static final long serialVersionUID = 1L; 
    private JComboBox mainComboBox; 
    private JComboBox subComboBox; 

    public ComboBoxTwo() { 
     String[] items = {"Select Item", "Color", "Shape", "Fruit"}; 
     String[] subItems1 = {"Select Color", "Red", "Blue", "Green"}; 
     mainComboBox = new JComboBox(items); 
     mainComboBox.addItemListener(this); 
     mainComboBox.addFocusListener(fcsListener); 
     add(mainComboBox, BorderLayout.WEST); 
     subComboBox = new JComboBox(subItems1); 
     subComboBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXX"); 
     subComboBox.addItemListener(this); 
     add(subComboBox, BorderLayout.EAST); 
    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     if (e.getStateChange() == ItemEvent.SELECTED) { 
      if (e.getSource() == mainComboBox) { 
       System.out.println("Source : mainComboBox"); 
      } else if (e.getSource() == subComboBox) { 
       System.out.println("Source : subComboBox"); 
      } 
     } 
    } 

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

      @Override 
      public void run() { 
       JFrame frame = new ComboBoxTwo(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
// 
    private FocusListener fcsListener = new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent e) { 
      dumpInfo(e); 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
      dumpInfo(e); 
     } 

     private void dumpInfo(FocusEvent e) { 
      System.out.println("Source : " + name(e.getComponent())); 
      System.out.println("Opposite : " + name(e.getOppositeComponent())); 
      System.out.println("Temporary: " + e.isTemporary()); 
      final Component c = e.getComponent();//works for editable JComboBox too 
      if (c instanceof JFormattedTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         ((JFormattedTextField) c).selectAll(); 
        } 
       }); 
      } else if (c instanceof JTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         ((JTextField) c).selectAll(); 
        } 
       }); 
      } 
     } 

     private String name(Component c) { 
      return (c == null) ? null : c.getName(); 
     } 
    }; 
} 
+0

Trước đây tôi đã sử dụng 'itemStateChanged' nhưng nó có vấn đề với mục đích của tôi và do đó tôi muốn sử dụng sự kiện FocusLost. Ví dụ của bạn đã không làm việc cho tôi mặc dù bạn có bình luận là * // làm việc cho JComboBox có thể chỉnh sửa quá *. Nhưng nó không hiệu quả với tôi. Xin cho biết. Tôi đang tìm kiếm nó trong một thời gian dài. – sarwar026

+0

@ sarwar026 trong biểu mẫu này hoạt động như tôi mong đợi, phần còn lại được chú ý trong câu trả lời của tôi, sử dụng ItemListener cho JComboBox, ví dụ như tôi đã đăng ở đây, – mKorbel

+0

@ sarwar026 đơn giản Tôi không hiểu vì sao bạn phải yêu cầu FocusListener , để được trợ giúp tốt hơn, hãy chỉnh sửa câu hỏi của bạn sớm hơn với [SSCCE] (http://sscce.org/) – mKorbel

5

Tôi đã tìm thấy một cách rất đơn giản để giải quyết vấn đề này.

Trình soạn thảo mặc định JComboBox có lớp nội bộ BasicComboBoxEditor $ BorderlessTextField là thành phần được lấy và mất tiêu điểm.

Nó có thể được truy cập chỉ đơn giản bằng

Component component = comboBox.getEditor().getEditorComponent(); 
if (component instanceof JTextField) 
    JTextField borderlesstextfield = (JTextField) borderless; 

Sau đó, thêm một người biết lắng nghe tập trung như bạn sẽ đến bất kỳ JTextField

borderlesstextfield.addFocusListener(new FocusListener() 
{ 
    public void focusGained(FocusEvent e) 
    { 
    } 
    public void focusLost(FocusEvent e) 
    { 
    } 
}}); 

Bây giờ bạn có một FocusListener rằng sẽ đáp ứng như mong đợi để đạt được và mất tập trung cho ComboBox

+0

Điều này làm việc hoàn hảo và phải là câu trả lời được chấp nhận vì câu trả lời ít phức tạp hơn! – Xerus

Các vấn đề liên quan