У меня есть пользовательский компонент (унаследованный от JComponent
), и мне нравится подчеркивать ссылку, удерживая нажатой CTRL вправо, как это делает eclipse. Я решил использовать InputMap
и ActionMap
для функции нажатия/отпускания клавиши.
Я использую этот код, чтобы найти ход:
stroke = KeyStroke.getKeyStroke("pressed CONTROL");
Но это как-то неправильно. Я отладил метод processKeyBinding
JComponent и обнаружил, что если я нажму CTRL, появится KeyStroke
с модификатором 130.
(это — моя карта ввода, arg0 — входящее нажатие клавиши с клавиатуры)
Я думаю, что 130 — это результат сложения CTRL_DOWN_MASK
с кодом 128
и CTRL_MASK
с кодом 2
.
- Почему я должен добавить эти модификаторы?
- Это кроссплатформенный?
- Есть ли официальная документация?
Полный пример запросов camickr:
public class Test extends JLabel {
public static void main(String[] args) {
final JFrame jf = new JFrame("Test");
final Test label = new Test();
jf.getContentPane().add(label);
jf.setBounds(200, 200, 500, 500);
jf.pack();
jf.setVisible(true);
label.grabFocus();
}
public Test() {
super("Foobar");
addBoldOnCtrl();
}
public void addBoldOnCtrl() {
final KeyStroke onDown = KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, KeyEvent.CTRL_MASK + KeyEvent.CTRL_DOWN_MASK);
final String onDownName = "react on ctrl";
getInputMap().put(onDown, onDownName);
getActionMap().put(onDownName, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
final Font f = getFont();
setFont(new Font(f.getFontName(), f.getStyle(), f.getSize() + 2));
repaint();
}
});
}
}
CTRL_MASK_DOWN
в целом. - person MadProgrammer   schedule 02.04.2016MouseEvent
- person MadProgrammer   schedule 02.04.2016AWTKeyStroke
. 2. Нет, давайте предположим, что я навел указатель мыши на ссылку, и без перемещения мыши я нажимаю CTRL, нажатие клавиши на клавиатуре не является перемещением мыши, и никакиеMouseEvent
не сработают. - person Grim   schedule 02.04.2016KeyStroke#getKeyStroke
вы увидите, что можете передать ему модификатор, в документах говорится, чтоx_DOWN_MASK
предпочтительнее старогоx_MASK
- person MadProgrammer   schedule 02.04.2016MouseMotionListener
является предпочтительным решением, посколькуMouseEvent
предоставляет параметрmodifier
, сообщающий вам, какие клавиши нажаты (shift/alt/ctrl), но это я - person MadProgrammer   schedule 02.04.2016MouseEvent
имеет хорошийisControlDown
(и другие) mwthos, которые подойдут. Имейте в виду, я никогда не мог заставитьVK_CONTROL
работать в качестве привязки клавиш, так что это может объяснить, почему я предпочитаю использоватьMouseMoitionListener
, но если это не то, что вам нужно, это ваш выбор, и мы можем просто оставить его. при этом. - person MadProgrammer   schedule 02.04.2016InputMap
иActionMap
, потому что CTRL — это какая-то специальная клавиша. - person Grim   schedule 02.04.2016KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, KeyEvent.CTRL_MASK + KeyEvent.CTRL_DOWN_MASK);
? - person Grim   schedule 02.04.2016|
, например , но проверим их или вместе - person MadProgrammer   schedule 02.04.2016KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, KeyEvent.CTRL_DOWN_MASK | KeyEvent.CTRL_MASK)
иKeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, KeyEvent.CTRL_MASK)
вроде работают - person MadProgrammer   schedule 02.04.2016CTRL_DOWN_MASK
win10 не работает. Я сообщу об ошибке. Пока ошибка не исправлена, я используюKeyEvent.CTRL_DOWN_MASK | KeyEvent.CTRL_MASK
, потому что она работает на Win10 и Mac. Часто ли шрифт увеличивается в полном коде (SSCCE), который я разместил в вопросе? - person Grim   schedule 02.04.2016