Я имел ввиду вот что. Привожу код, написанный "на коленке":
Код | package bai.test.swing;
import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;
import javax.swing.*;
/** * <p>Title: </p> * * <p>Description: </p> * * <p>Copyright: Copyright (c) 2007</p> * * <p>Company: </p> * * @author жжот * @version 1.0 */ public class TestFocusFrame extends JFrame { JComponent[] components = null; public TestFocusFrame() { this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); // компоненты: JButton button = new JButton(" Test button "); JTextField textField = new JTextField(); JFormattedTextField formattedTextField = new JFormattedTextField(); JComboBox comboBox = new JComboBox(new Object[]{"One", "Two", "Three"});
components = new JComponent[]{ textField, button, formattedTextField, comboBox };
this.getContentPane().setLayout( new BoxLayout( this.getContentPane(), BoxLayout.Y_AXIS ) ); this.getContentPane().add( Box.createVerticalStrut(10) ); this.getContentPane().add( textField ); this.getContentPane().add( Box.createVerticalStrut(10) ); this.getContentPane().add( button ); this.getContentPane().add( Box.createVerticalStrut(10) ); this.getContentPane().add( formattedTextField ); this.getContentPane().add( Box.createVerticalStrut(10) ); this.getContentPane().add( comboBox ); /** * Слушатель. При нажатии заданной клавиши определяет владельца фокуса, его * индекс в списке компонентов и, в случае успеха, передаёт фокус * след. элементу в списке */ KeyListener listener = new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 40) { // определяем владельца фокуса: java.awt.Component focusOwner = FocusManager.getCurrentManager(). getFocusOwner(); int index = 0; // индекс владельца фокуса for (; index < components.length && focusOwner != components[index]; index++) {}
if (index < components.length) { // проверка был ли найден элемент в списке final int nextCompIndex = // индекс след.компонента (index == components.length - 1) ? // если текущий владелец фокуса - последний в списке 0 : // перейти к первому элементу (с индексом 0) ++index; // иначе - индекс текущего + 1 SwingUtilities.invokeLater(new Runnable() { public void run() { // передача фокуса: components[nextCompIndex].requestFocus(); } }); } } } }; // назначаем слушатель всем компонентам: for (JComponent component : components){ component.addKeyListener( listener ); } this.setVisible( true ); this.pack(); }
public static void main(String[] args) { TestFocusFrame testfocusframe = new TestFocusFrame(); } }
|
При необходимости использовать в реальной жизни можно усовершенствовать (например, держать карту тек.компонент - след.компонент, что позволит не производить каждый раз поиск перебором по массиву компонентов). |