2013-09-05 3 views
-1

Я пытаюсь удалить F10 кнопку ключа связывания с JTextField, но ничего не работает ниже:JTextField и клавиша F10 - как удалить привязку клавиш?

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.KEY_PRESSED), "none"); 
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.KEY_TYPED), "none"); 
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.KEY_RELEASED), "none"); 

На самом деле, я хочу, чтобы контролировать всплывающее меню - показать/скрыть, но F10 не работает правильно - он выполняет некоторые другие действия. Если я переключу, например, на F11, все будет хорошо.

Как я знаю, - Сдвиг + F10 показывает всплывающие окна на различных платформах.

+0

, что именно вы имеете в виду под _but F10 не работает correctly_ - это показывает всплывающее окно, как и следовало ожидать (по крайней мере в выигрыш, не знаю других ОС), так что _do_ вы ожидаете? – kleopatra

+0

Мое всплывающее окно просто JWindow, и если используется F10 - очень странное поведение - всплывающие кнопки иногда не получают MouseEvents (они должны исчезать в/из).И еще одно - когда я нажимаю F10, когда мышь над JTextField - поле потеряно и снова попадает в фокус. –

+0

Вы пробовали некоторые другие условия, например 'getInputMap (JComponent.WHEN_FOCUSED)'? – MadProgrammer

ответ

5

KeyStroke.getKeyStroke(int, int) не используется, чтобы получить KeyStroke для печати или освободить событие, оно используется для применения модификатора к KeyStroke в виде KeyEvent.SHIFT_DOWN_MASK и/или KeyEvent.CTRL_DOWN_MASK и/или KeyEvent.ALT_DOWN_MASK и/или KeyEvent.ALT_GRAPH_DOWN_MASK и/или KeyEvent.META_DOWN_MASK ...

Вместо getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.KEY_PRESSED), "none"); вы должны использовать getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "none");

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

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JTextField; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTextFieldKeyStroke { 

    public static void main(String[] args) { 
     new TestTextFieldKeyStroke(); 
    } 

    public TestTextFieldKeyStroke() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      JTextField field = new JTextField(20); 
      add(field); 
      JPopupMenu pop = new JPopupMenu(); 

      field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "happy"); 
      field.getActionMap().put("happy", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Happy"); 
       } 
      }); 

     } 
    } 
} 

Обновлены всплывающие окна

Я до сих пор не хватает что-то здесь, основываясь на предыдущем примере, если я что-то вроде ...

final JTextField field = new JTextField(20); 
add(field); 
JPopupMenu pop = new JPopupMenu(); 
pop.add(new JLabel("Hello")); 
field.setComponentPopupMenu(pop); 

field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "happy"); 
field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.CTRL_DOWN_MASK), "happy"); 
field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.ALT_DOWN_MASK), "happy"); 
field.getActionMap().put("happy", new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     JPopupMenu popup = field.getComponentPopupMenu(); 
     popup.show(field, 0, field.getHeight()); 
    } 
}); 

я могу получить его, чтобы показать JPopupMenu

enter image description here

+0

Но как я могу удалить существующие действия для F10, SHIFT + F10 и CTRL + F10? Я описал проблему ниже. –

+0

'F10' - это удар по системному ключу, используемый API доступности, чтобы сфокусировать панель меню ... видимо ... – MadProgrammer

+0

Вы можете удалить его по всему миру или просто по полю? Если я назначу ключевой штрих в поле, я могу показать всплывающее окно без проблем. Вы также должны понимать, что многие применения ожидают, что F10 выполнит определенное действие, это не ограничивается только Java, а ОС в целом ... – MadProgrammer

-1

Я попробовал это, и это горе очий:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "doNothing"); 
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.SHIFT_DOWN_MASK), "doNothing"); 
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.CTRL_DOWN_MASK), "doNothing"); 

     getActionMap().put("doNothing", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       //Do nothing 
      } 
     }); 

Теперь F10, сдвиг + F10 и Ctrl +F10 события удаляются. Но если я пропущу getActionMap().put("doNothing", new AbstractAction() {}), то привязки клавиш выше не работают .., но кажется, что где-то какое-то действие все еще привязано - курсор меняется (от Cursor.TEXT_CURSOR до Cursor.MOVE_CURSOR и снова возвращается к Cursor.TEXT_CURSOR), когда я нажимаю на эти кнопки (ничего не должен делать). Я пробовал textField.getActionMap().size(), но он возвращает 0. Поэтому я предполагаю, что действие прикреплено к другому компоненту. Можно ли это узнать?

EDIT:

Здесь http://docs.oracle.com/javase/... я нашел ответы на все вопросы ... :)

+0

это не имеет смысла без контекста - вы _still_ не объясняете _why_, вы хотите бороться с фреймворком ... – kleopatra

+0

Поскольку я использую свое всплывающее меню (настраиваемое на заказ, расширяет 'JWindow') и предопределенное действие F10 не позволяет нормально его функционировать. Мне нужно отключить все события F10. –

+0

_I нужно отключить все F10_ нет, скорее всего, вы делаете что-то не так в коде, который вы не показываете – kleopatra

Смежные вопросы