2011-03-17 72 views
2

我的應用程序在左側有一個樹形控件,在右側有許多窗體,選項卡等。當用戶按下Ctrl + F搜索面板出現在左側的樹下,因此用戶可以搜索樹的內容。java中的依賴於上下文的鍵盤綁定Swing

這是通過菜單加速器完成的。

然而,當某個標籤是右開,我想按Ctrl +˚F在這個選項卡中打開搜索面板,在標籤裏面的內容進行搜索。

我已經定義了密鑰此選項卡綁定:

tab.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK), "showSearch"); 
tab.getActionMap().put("showSearch", showSearchAction); 

showSearchAction上方打開的選項卡中的搜索面板。

這不起作用。即使當標籤集中時,Ctrl + F仍然打開樹下的搜索面板。

我怎樣才能讓上按Ctrl +˚F發生的動作取決於當前焦點組件上?

回答

0
tab.getInputMap(WHEN_FOCUSED)... 

編輯:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.event.*; 

public class TabbedPaneBinding extends JFrame 
{ 
    public TabbedPaneBinding() 
    { 
     JMenuBar menuBar = new JMenuBar(); 
     setJMenuBar(menuBar); 
     JMenu menu = new JMenu("File"); 
     menuBar.add(menu); 
     JMenuItem menuItem = new JMenuItem("Search"); 
     menuItem.setAccelerator(KeyStroke.getKeyStroke("control F")); 
     menu.add(menuItem); 

     menuItem.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       System.out.println("do Search"); 
      } 
     }); 

     add(new JTextField(10), BorderLayout.NORTH); 

     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.addTab("Text Field", new JTextField(10)); 
     tabbedPane.addTab("CheckBox", new JCheckBox()); 
     add(tabbedPane); 

     AbstractAction action = new AbstractAction() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       System.out.println("tabbed pane Search"); 
      } 
     }; 

     String keyStrokeAndKey = "control F"; 
     KeyStroke keyStroke = KeyStroke.getKeyStroke(keyStrokeAndKey); 
//  InputMap im = tabbedPane.getInputMap(JTabbedPane.WHEN_FOCUSED); 
     InputMap im = tabbedPane.getInputMap(JTabbedPane.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     im.put(keyStroke, keyStrokeAndKey); 
     tabbedPane.getActionMap().put(keyStrokeAndKey, action); 
    } 

    public static void main(String args[]) 
    { 
     TabbedPaneBinding frame = new TabbedPaneBinding(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setSize(200, 150); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

都能跟得上。仍然打開樹搜索。 – Alla 2011-03-17 20:14:49

+0

@Alla,在簡單的SSCCE中對我很好。發佈證明問題的SSCCE。 – camickr 2011-03-17 20:53:58

+0

感謝您的SSCCE,現在我明白了。該問題是由調用getInputMap(WHEN_ANCESTOR_OF_FOCUSED)而不是getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED)引起的。改變這個解決了這個問題。它與菜單加速器無關。 – Alla 2011-03-18 08:48:24