Определение непосредственных соседей JComponent в FlowLayout - PullRequest
1 голос
/ 26 апреля 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

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

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

Container.getComponentAt(Point p) 

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

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

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

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

1 голос
/ 26 апреля 2011

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

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

Дополнительная информация:

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

...