2015-05-22 5 views
0

Нажатие клавиши Control Я хочу показать Jtooltip Jbutton.Подсказка, чтобы показать нажатие клавиши в java

Как я могу показать всплывающую подсказку о желаемых нажатиях клавиш?

+0

положить какой-то код или исследовательские усилия plz – tharif

+0

Вы хотите, чтобы это было сделано для определенной кнопки или кнопки, сфокусированной в данный момент? – MadProgrammer

+0

[Ключевые привязки] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) поможет – MadProgrammer

ответ

2

Не уверен, что я понимаю вопрос, но вы можете использовать Control+F1, чтобы отобразить всплывающую подсказку текущего сфокусированного компонента.

+1

Спасибо, что научили меня чему-то новому сегодня +1 – MadProgrammer

+0

Без движения мыши вы можете показать всплывающую подсказку с указанным ключом ввода? @MadProgrammer – Sibal

+0

@Sibal Попробуйте и посмотрите. После того, как элемент управления имеет фокус, ctrl + F1 покажет всплывающую подсказку – MadProgrammer

1

Существует 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) для вызова метода privateshowToolTipManager.

Вам нужны «нажать» и «Выброс» действия, так как в противном случае вы получите повторное ключевое событие, которое заставит наконечник инструмента «вспышку»

решения camickr является лучше (и правильно) выбором , это было просто «интересно», как «хак»

+0

Благодаря вашим усилиям. Есть программирование с использованием Flamingo, CTRL F1 не работает, я смотрел по-другому. Возможно, если CTRL часто является проблемой, лучше, если мы будем использовать ALT? – Sibal

+0

Это скорее сочетание клавиш, ctrl или alt - это не очень хорошая идея, поскольку они, как правило, используются для генерации других ключевых штрихов. Может быть, вам нужно связать ctrl + F1 самостоятельно – MadProgrammer