2013-07-24 43 views
5

Tôi gặp sự cố với ứng dụng Swing, nhờ đó trọng tâm đôi khi sẽ nhận được trường nhập văn bản vì lý do tôi hiện không thể xác định. Tôi nghi ngờ một điều kiện chủng tộc của một số loại nhưng tôi không thể nhìn thấy những gì đang gây ra sự kiện tập trung.Xác định nguồn gốc của yêu cầu lấy nét trong Giao diện người dùng Java Swing

Trường này có trình nghe tập trung gắn liền với nó để nó thẳng về phía trước để thêm điểm ngắt cho trình xử lý sự kiện focusGained(). Khi tôi làm vậy, tôi có thể thấy sự kiện cơ bản mà lần lượt chứa một thể hiện của CausedFocusEvent.Cause. Trường tên được đặt thành "ACTIVATION".

Nhìn vào vết đống, tôi có thể thấy như sau:

Thread [AWT-EventQueue-0] (Suspended (breakpoint at line 174 in MyPanel$3)) 
    MyPanel$3.focusGained(FocusEvent) line: 174 
    AWTEventMulticaster.focusGained(FocusEvent) line: not available 
    InputField(Component).processFocusEvent(FocusEvent) line: not available 
    InputField(Component).processEvent(AWTEvent) line: not available  
    InputField(Container).processEvent(AWTEvent) line: not available  
    InputField(Component).dispatchEventImpl(AWTEvent) line: not available 
    InputField(Container).dispatchEventImpl(AWTEvent) line: not available 
    InputField(Component).dispatchEvent(AWTEvent) line: not available 
    DefaultKeyboardFocusManager(KeyboardFocusManager).redispatchEvent(Component, AWTEvent) line: not available 
    DefaultKeyboardFocusManager.typeAheadAssertions(Component, AWTEvent) line: not available  
    DefaultKeyboardFocusManager.dispatchEvent(AWTEvent) line: not available 
    InputField(Component).dispatchEventImpl(AWTEvent) line: not available 
    InputField(Container).dispatchEventImpl(AWTEvent) line: not available 
    InputField(Component).dispatchEvent(AWTEvent) line: not available 
    SunToolkit$1.run() line: not available 
    PeerEvent(InvocationEvent).dispatch() line: not available 
    EventQueue.dispatchEventImpl(AWTEvent, Object) line: not available 
    EventQueue.access$200(EventQueue, AWTEvent, Object) line: not available 
    EventQueue$3.run() line: not available 
    EventQueue$3.run() line: not available 
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]  
    ProtectionDomain$1.doIntersectionPrivilege(PrivilegedAction<T>, AccessControlContext, AccessControlContext) line: not available 
    EventQueue.dispatchEvent(AWTEvent) line: not available 
    EventDispatchThread.pumpOneEventForFilters(int) line: not available 
    EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter) line: not available 
    EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component) line: not available 
    EventDispatchThread.pumpEvents(int, Conditional) line: not available  
    EventDispatchThread.pumpEvents(Conditional) line: not available 
    EventDispatchThread.run() line: not available 

Lưu ý rằng InputField là một lớp con của JTextField rằng với những thay đổi nhỏ liên quan đến vẽ của văn bản.

Tất cả những gì tôi có thể biết từ dấu vết ngăn xếp là một cái gì đó trên EDT đã gây ra InputField trong MyPanel để lấy tiêu điểm.

Có bất kỳ thông tin nào khác mà tôi có thể nhận được hay không sẽ cho tôi khả năng hiển thị về lý do thành phần này đạt được bởi thành phần này?

+1

Không nên có bất kỳ điều kiện chủng tộc nào vì tất cả các sự kiện Swing phải được thực hiện trên một chuỗi duy nhất, EDT. Xem xét cố gắng tách biệt mã gây ra sự cố bằng cách cắt mã cho đến khi sự cố biến mất và do đó cố gắng tìm mã tối thiểu tái tạo sự cố và sau đó đăng nó ở đây. Tò mò: bạn đang sử dụng FocusListener làm gì? –

+1

Tôi đồng ý về chủ đề duy nhất nhưng mối quan tâm của tôi là swing có thể thực hiện hiển thị bên dưới theo thứ tự không xác định và điều gì đó vô tình phụ thuộc vào thứ tự đó. Trình nghe tập trung chủ yếu chỉ để gỡ lỗi, nó không có bất kỳ ảnh hưởng nào khi lấy nét, nó chỉ phản ứng với nó. – PhilDin

+1

'là một cái gì đó trên EDT gây ra InputField trong MyPanel để đạt được focus.' xin vui lòng gây ra từ ???, để được trợ giúp tốt hơn sớm hơn đăng một SSCCE, ngắn, runnable, compilable, gây ra vấn đề với focusGained từ InputField chuyển hướng bởi ngoại lệ JVM MyPanel – mKorbel

Trả lời

0

Tôi đã gặp sự cố tương tự,

ở cuối Tôi chỉ xác định hệ thống phân cấp tiêu điểm và kiểm soát tập trung từ java. Nó đi một chút gì đó như thế này:

// Setting The FOCUS Order. 
    Vector<Component> order = new Vector<Component>(7); 
    order.add(projectNameJTextField); 
    order.add(companyJTextField); 
    order.add(orderedByJTextField); 
    order.add(phoneJTextField); 
    order.add(jRadioNormalPriority); 
    order.add(jRadioHighPriority); 
    order.add(jCheckBox1); 
    order.add(jCheckBox2); 
    order.add(jCheckBox3); 
    order.add(jCheckBox4); 
    order.add(jCheckBox5); 
    order.add(jCheckBox6); 
    order.add(textDetailJTextArea); 
    order.add(technitianJComboBox); 
    order.add(aproxTimeJTextField); 
    order.add(sendButton); 

    // Sending the costume focus order to the focus Policy Class, 
    MyOwnFocusTraversalPolicy newPolicy = new MyOwnFocusTraversalPolicy(order); 
    setFocusTraversalPolicy(newPolicy); 

và bạn cũng sẽ cần Lớp này:

import java.awt.Component; 
    import java.awt.Container; 
    import java.awt.FocusTraversalPolicy; 
    import java.util.Vector; 



    // This Class Helps to Set A Costume FOCUS Order. 
    public class MyOwnFocusTraversalPolicy extends FocusTraversalPolicy 
    { 
    Vector<Component> order; 

    public MyOwnFocusTraversalPolicy(Vector<Component> order) { 
     this.order = new Vector<Component>(order.size()); 
     this.order.addAll(order); 
    } 
    public Component getComponentAfter(Container focusCycleRoot, 
             Component aComponent) 
    { 
     int idx = (order.indexOf(aComponent) + 1) % order.size(); 
     return order.get(idx); 
    } 

    public Component getComponentBefore(Container focusCycleRoot, 
             Component aComponent) 
    { 
     int idx = order.indexOf(aComponent) - 1; 
     if (idx < 0) { 
      idx = order.size() - 1; 
     } 
     return order.get(idx); 
    } 

    public Component getDefaultComponent(Container focusCycleRoot) { 
     return order.get(0); 
    } 

    public Component getLastComponent(Container focusCycleRoot) { 
     return order.lastElement(); 
    } 

    public Component getFirstComponent(Container focusCycleRoot) { 
     return order.get(0); 
    } 
    } 

(đây không phải là giải pháp của tôi, và tôi không thể nhớ nơi tôi đã nhận nó từ)

Hy vọng tôi có thể giúp :)

Dave.

+0

_ "Tôi không thể nhớ nơi tôi đã nhận nó từ" _ - Có thể ngay từ [ví dụ hướng dẫn] (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle .com/javase/tutorial/uiswing/example/misc/FocusTraversalDemoProject/src/misc/FocusTraversalDemo.java) ;-) –

+0

phải :) cảm ơn vì đã nhắc tôi :) –