2013-03-06 2 views
0

У меня есть JComboBox, установленный как Editable, который я хотел бы, чтобы пользователь мог перейти к следующему элементу управления после нажатия клавиши ввода. Я пробовал много подходов, но ни один из них не работал, на одном из них событие успешно запущено (EditorCompoment.keyRelease), однако метод «transferFocus()» не переносит фокус на следующий элемент управления, как должен. Любая помощь очень ценится. БлагодаряВведите ключ, чтобы вести себя как вкладка на редактируемом JComboBox

public static void addEnterKeyListener(final javax.swing.JComboBox field) 
{ 
    field.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 
    field.setFocusTraversalKeysEnabled(false); 

    Action myAction = new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     field.transferFocus(); 
    } 

    }; 

    field.getActionMap().put("enter-action", myAction); 

    field.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("ENTER"), "enter-action"); 

    field.addKeyListener(new KeyAdapter() 
    { 
     @Override 
     public void keyReleased(final KeyEvent e) 
     { 
      if (e.getKeyCode() == KeyEvent.VK_ENTER) 
      { 
       System.out.println("Pressed enter inside JComboBox"); 
       field.transferFocus(); 
      } 
     } 
    }); 

    field.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() 
    { 
     @Override 
     public void keyReleased(final KeyEvent e) 
     { 
      System.out.println("Pressed enter inside JComboBox #2"); 

      if (e.getKeyCode() == KeyEvent.VK_ENTER) 
      {      
       field.transferFocus(); 
       /*This will fire but will not transfer the focus to the next control*/ 
       System.out.println("Transfered the focus from JComboBox"); 
      } 
     } 
    }); 

    field.getEditor().addActionListener(new ActionListener() 
    { 
     @Override public void actionPerformed(ActionEvent arg0) 
     { 
      field.transferFocus(); 
     }    
    }); 

    System.out.println("Added enter events to JComboBox"); 
} 
+0

Это хорошо объясняется *** [здесь] (http://docs.oracle.com /javase/tutorial/uiswing/misc/focus.html)***. Вы должны использовать 'setFocusTraversalKeys()' –

+0

, пожалуйста, почему вы добавили кучу Listeners, можете ли вы описать настоящую причину, все эти события не доработаны до тех пор, пока всплывающее окно не будет видно, а затем ничего не вернет или ...., обязательно там несколько способов, для лучшей помощи, прежде чем опубликовать [SSCCE] (http://sscce.org/), короткий, выполнимый, компилируемый, только вопрос, пожалуйста, чтобы отредактировать вопрос с подробным описанием (просто избегая изобретать велосипеды), возможно есть/есть другой способ (ы) – mKorbel

ответ

1

Нанести ActionListener к editorComponent (а) JTextField в редакторе комбо:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class JComboBoxDemo implements Runnable 
{ 
    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new JComboBoxDemo()); 
    } 

    public void run() 
    {  
    JComboBox comboBox = new JComboBox(new String[]{"A", "B", "C"}); 
    comboBox.setEditable(true); 

    final JTextField editorComponent = (JTextField) comboBox.getEditor().getEditorComponent(); 
    editorComponent.addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
     editorComponent.transferFocus(); 
     } 
    }); 

    JPanel panel = new JPanel(new FlowLayout()); 
    panel.add(new JLabel("Field 1")); 
    panel.add(comboBox); 
    panel.add(new JLabel("Field 2")); 
    panel.add(new JTextField(10)); 
    panel.add(new JLabel("Field 3")); 
    panel.add(new JTextField(10)); 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 

    Container c = frame.getContentPane(); 
    c.setLayout(new BorderLayout()); 
    c.add(panel, BorderLayout.CENTER); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 
+0

Отлично, спасибо. –