2013-05-18 4 views
0

У меня есть JPanel, который использует KeyListener как область содержимого в качестве окна; однако есть кнопки и текстовые поля в макете сетки поверх JPanel.Предоставление приоритета приоритета JPanel

Как определить приоритет фокуса JPanel, чтобы он сохранял фокус после редактирования текста или нажатия кнопок, чтобы я мог прочитать ввод ключа?

ответ

0

Вам нужно просто добавить FocusListener на событие focusLost, а затем запросить фокус снова. Что-то вроде этого:

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

public class JPanelFocus { 
    public static void main(String... argv) throws Exception { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
     JFrame f = new JFrame("FocusTest"); 
     JButton b = new JButton("Button"); 
     final JPanel p = new JPanel(); 
     p.add(b); 
     // Here is the KeyListener installed on our JPanel 
     p.addKeyListener(new KeyAdapter() { 
      public void keyTyped(KeyEvent ev) { 
      System.out.println(ev.getKeyChar()); 
      } 
     }); 
     // This is the bit that does the magic - make sure 
     // that our JPanel is always focussed 
     p.addFocusListener(new FocusAdapter() { 
      public void focusLost(FocusEvent ev) { 
      p.requestFocus(); 
      } 
     }); 
     f.getContentPane().add(p); 
     f.pack(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
     // Make sure JPanel starts with the focus 
     p.requestFocus(); 
     } 
    }); 
    } 
} 

Это не будет работать, если у вас есть поля, которые нужно держать в центре внимания, хотя (вы упомянули редактируемое текстовое поле). Когда ключевые события переходят в текстовое поле и когда они должны идти в JPanel?

0

В качестве альтернативы вы также можете просто сделать дочерние компоненты неактивными.

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

class MyPanel extends JPanel implements KeyListener { 
    public MyPanel() { 
     this.setFocusable(true); 
     this.addKeyListener(this); 

     // for each component 
     JComboBox<String> comboBox = new JComboBox<String>(); 
     comboBox.addItem("Item1"); 
     this.add(comboBox); 
     // this is what keeps each child from intercepting KeyEvents 
     comboBox.setFocusable(false); 
    } 

    public void keyPressed(KeyEvent e) { ... } 
    public void keyTyped(KeyEvent e) { ... } 
    public void keyReleased(KeyEvent e) { ... } 

    public static void main(String[] args) { 
     // create a frame 
     JFrame frame = new JFrame(); 
     frame.setSize(640, 480); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // add MyPanel to frame 
     MyPanel panel = new MyPanel(); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 
} 
Смежные вопросы