Определение непосредственных соседей JComponent в FlowLayout

У меня есть JPanel, который использует FlowLayout и содержит много JButton. Кнопки находятся в двумерной сетке (от FlowLayout). Размер JPanel можно изменить, и, конечно, когда это так, расположение кнопок в сетке изменяется (хотя порядок, конечно, остается прежним). Я хочу, чтобы пользователь мог перемещаться от одной кнопки к другой в сетке с помощью клавиш со стрелками на клавиатуре.

Есть ли способ определить для данной кнопки, какая кнопка в данный момент находится непосредственно над ней, какая кнопка находится непосредственно под ней и какие кнопки находятся непосредственно слева и справа?

Очевидно, это было бы тривиально, если бы я использовал GridLayout, но мне нужно использовать FlowLayout по другим причинам.

2 ответа

Решение

Клавиши со стрелками влево и вправо не являются проблемой. Как упомянуто jzd, вы просто добавляете KeyStrokes к набору ключей обхода.

Для клавиш вверх / вниз вам нужно будет создать собственное действие. Вы можете использовать местоположение текущего компонента. Затем, чтобы подняться вверх, вы можете изменить координату Y, скажем, на 10 пикселей (5 пикселей для разрыва строк между компонентами плюс дополнительные 5). Тогда вы можете использовать:

Container.getComponentAt(Point p) 

чтобы найти компонент в этом новом месте.

Чтобы перейти вниз, вы должны начать с расположения кнопки, а затем добавить высоту кнопки плюс 10 пикселей.

Конечно, вы должны использовать привязки клавиш для привязки клавиш вверх / вниз к действию.

Примечание: я не уверен, нужно ли вам добавить 5 дополнительных пикселей, чтобы найти компонент выше или ниже компонента. Вы можете просто использовать вертикальный зазор. Я просто не уверен, как работает проверка границ в методе getComponentAt().

Я думаю, что вы можете просто использовать реализацию перемещения фокуса, которая находится на месте, как вкладка или сдвиг перемещается выбранных кнопок в FlowLayout правильно.

Я думаю, вам просто нужно добавить клавиши со стрелками в наборы, такие как forwardDefaultFocusTraversalKeys

Больше информации:

http://download.oracle.com/javase/tutorial/uiswing/misc/focus.html

Другие вопросы по тегам