Нажатие клавиши Control Я хочу показать Jtooltip Jbutton.Подсказка, чтобы показать нажатие клавиши в java
Как я могу показать всплывающую подсказку о желаемых нажатиях клавиш?
Нажатие клавиши Control Я хочу показать Jtooltip Jbutton.Подсказка, чтобы показать нажатие клавиши в java
Как я могу показать всплывающую подсказку о желаемых нажатиях клавиш?
Не уверен, что я понимаю вопрос, но вы можете использовать Control+F1
, чтобы отобразить всплывающую подсказку текущего сфокусированного компонента.
Спасибо, что научили меня чему-то новому сегодня +1 – MadProgrammer
Без движения мыши вы можете показать всплывающую подсказку с указанным ключом ввода? @MadProgrammer – Sibal
@Sibal Попробуйте и посмотрите. После того, как элемент управления имеет фокус, ctrl + F1 покажет всплывающую подсказку – MadProgrammer
Существует private
метод в TooltipManager
называется show
который принимает JComponent
в качестве параметра, который используется, чтобы показать всплывающую подсказку. Это фактически израсходованной TooltipManager
когда CTRL +F1 нажимается ...
Итак, моя первая рекомендация будет использовать CTRL +F1, потому что он построен. Моя вторая рекомендация заключается в использовать CTRL +F1, потому что люди нажмите CTRL для многих причин (например, копирование/вставка, пунктам меню и т.д.), которые могут быть весьма раздражает, если вы держать выскакивают всплывающие подсказки все время. Моя третья рекомендация использовать CTRL +F1, так как метод show
является private
Однако, потому что я просто любопытно (и совершенно сумасшедший), вы «может» (но я бы не рекомендовал его) используйте грязный грязный взломать (я упал, как Филипп Фрай), который так же вероятно взорвется на вашем лице, как решить проблему (но мне было любопытно, как связать действие с CTRL)
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import static javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
JButton btn = new JButton("Banana");
btn.setToolTipText("Hello");
add(btn);
TooltipPopup.register(this);
}
}
public static class TooltipPopup {
public static void register(JComponent comp) {
new TooltipPopup(comp);
}
private JComponent parent;
private boolean showing = false;
private TooltipPopup(JComponent parent) {
this.parent = parent;
bindKeyStrokeTo(parent,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,
"help.press",
KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, InputEvent.CTRL_DOWN_MASK),
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (!showing) {
Component comp = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if (comp != null && comp instanceof JComponent) {
JComponent focused = (JComponent) comp;
try {
Class clazz = ToolTipManager.sharedInstance().getClass();
Method method = clazz.getDeclaredMethod("show", JComponent.class);
method.setAccessible(true);
method.invoke(ToolTipManager.sharedInstance(), focused);
showing = true;
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
ex.printStackTrace();
}
}
}
}
});
bindKeyStrokeTo(parent,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,
"help.release",
KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, 0, true),
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
showing = false;
}
});
}
public void bindKeyStrokeTo(JComponent parent, int condition, String name, KeyStroke keyStroke, Action action) {
InputMap im = parent.getInputMap(condition);
ActionMap am = parent.getActionMap();
im.put(keyStroke, name);
am.put(name, action);
}
}
}
Все это делаетсвязанный пресс и освобождение Action
- CTRL для данного компонента (родительского контейнера), который найдет компонент, сфокусированный в данный момент, и покажет его подсказку.
Используется рефлектор «галочка» (hack) для вызова метода private
show
ToolTipManager
.
Вам нужны «нажать» и «Выброс» действия, так как в противном случае вы получите повторное ключевое событие, которое заставит наконечник инструмента «вспышку»
решения camickr является лучше (и правильно) выбором , это было просто «интересно», как «хак»
Благодаря вашим усилиям. Есть программирование с использованием Flamingo, CTRL F1 не работает, я смотрел по-другому. Возможно, если CTRL часто является проблемой, лучше, если мы будем использовать ALT? – Sibal
Это скорее сочетание клавиш, ctrl или alt - это не очень хорошая идея, поскольку они, как правило, используются для генерации других ключевых штрихов. Может быть, вам нужно связать ctrl + F1 самостоятельно – MadProgrammer
положить какой-то код или исследовательские усилия plz – tharif
Вы хотите, чтобы это было сделано для определенной кнопки или кнопки, сфокусированной в данный момент? – MadProgrammer
[Ключевые привязки] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) поможет – MadProgrammer