2012-06-22 209 views
1

我自動生成一組JMenuItem並將它們添加到每個右鍵單擊事件中的JPopUpMenu。問題在於,當我按下所選菜單上的回車鍵時,爲菜單項設置的操作不會運行。我可以使用上/下鍵在菜單上進行導航,但是,只有通過鼠標點擊才能執行該操作。JMenuItem沒有被鍵盤輸入鍵激活

下面是一段代碼來創建菜單項:

private JMenuItem createMenuItem(TaskFactory tf, String title, boolean useCheckBoxMenuItem, String toolTipText) { 

    enter code hereJMenuItem item; 
    PopupAction action = new PopupAction(tf, title); 
    if (useCheckBoxMenuItem) 
     item = new JCheckBoxMenuItem(action); 
    else 
     item = new JMenuItem(action); 
    item.setEnabled(tf.isReady()); 
    item.setToolTipText(toolTipText); 
    return item; 
} 

private class PopupAction extends AbstractAction { 

    TaskFactory tf; 
    PopupAction(TaskFactory tf, String title) { 
     super(title); 
     this.tf = tf; 
    } 
    public void actionPerformed(ActionEvent ae) { 
     m_view.manager.execute(tf.createTaskIterator()); 
    } 
} 

我已經嘗試設置可聚焦於真實的,但沒有奏效。我已經在Mac 10.7 Java版本1.6.0_33和Ubuntu Java版本1.6.0_26上嘗試過了。我使用了標準的鞦韆外觀和感覺。當在Mac上運行時:外觀和感覺是[Aqua Look and Feel for Mac OS X - com.apple.laf.AquaLookAndFeel]

+0

請參閱我的編輯,測試'ButtonModel'作爲我最喜歡的'XxxMenuXxx'和他們的鍵盤或鼠標事件監聽器 – mKorbel

+0

嘗試應用Nimbus外觀和感覺,但仍然菜單項不聽輸入/空格鍵鍵。 – rozagh

+0

aaach,好吧我將添加代碼示例實現MenuKeyListener – mKorbel

回答

1

AFAIK,這就是外觀的感覺。按下空格鍵可以點擊按鈕和菜單項。回車是爲了點擊默認按鈕。

+0

感謝replu,空格鍵也不起作用!對我來說,如果他們運行這個動作,空格鍵或輸入都可以。 – rozagh

+0

user1475727請您具體一下,NativeOS,Java版本和使用外觀和感覺,因爲(@JB Nizet)可能是正確的 – mKorbel

+0

我已經在Mac 10.7 Java版本1.6.0_33和Ubuntu Java版本1.6.0_26上嘗試過。我使用了標準的鞦韆外觀和感覺。 – rozagh

2

的Windows XP,JDK6_025,與物質,金屬,窗,雨雲

EDIT1

鍵或鼠標按下的燃煤isEnabled

EDIT2

添加MenuKeyListener工作,

NOTICE !!!!!

不使用MenuKeyListener用於捕捉另一KeyEvents(空間),並是,否則產生有時虛假的結果,如Unknown keyCode: 0x0 on …

import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.event.MenuKeyEvent; 
import javax.swing.event.MenuKeyListener; 
import javax.swing.event.PopupMenuEvent; 
import javax.swing.event.PopupMenuListener; 
import javax.swing.table.*; 
import org.pushingpixels.substance.api.SubstanceLookAndFeel; 
import org.pushingpixels.substance.api.skin.BusinessBlueSteelSkin; 

public class TableCheckBox extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTable table; 

    public TableCheckBox() { 
     Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"}; 
     Object[][] data = { 
      {"Buy", "IBM", new Integer(1000), new Double(80.50), false}, 
      {"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true}, 
      {"Sell", "Apple", new Integer(3000), new Double(7.35), true}, 
      {"Buy", "Nortel", new Integer(4000), new Double(20.00), false} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     table = new JTable(model) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Class getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
     createPopupMenu(); 
    } 

    private void createPopupMenu() { 
     MyMenuKeyListener myMenuKeyListener = new MyMenuKeyListener(); 
     JPopupMenu popup = new JPopupMenu(); 
     JMenuItem myMenuItem1 = new JMenuItem("cccccccccccccccccccccc"); 
     myMenuItem1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       //System.out.println("Done myMenuItem1"); 
      } 
     }); 
     myMenuItem1.getModel().addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       ButtonModel model = (ButtonModel) e.getSource(); 
       if (model.isArmed()) { 
        //System.out.println("isArmed"); 
       } else if (model.isEnabled()) { 
        //System.out.println("isEnabled"); 
       } else if (model.isPressed()) { 
        //System.out.println("isPressed"); 
       } else if (model.isRollover()) { 
        //System.out.println("isRollover"); 
       } else if (model.isSelected()) { 
        //System.out.println("isSelected"); 
       } 
      } 
     }); 
     myMenuItem1.addMenuKeyListener(myMenuKeyListener); 

     JMenuItem myMenuItem2 = new JMenuItem("bbbbbbbbbbbbbbbbbbbbbb"); 
     myMenuItem2.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       //System.out.println("Done myMenuItem2"); 
      } 
     }); 
     myMenuItem2.getModel().addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       ButtonModel model = (ButtonModel) e.getSource(); 
       if (model.isArmed()) { 
        //System.out.println("isArmed"); 
       } else if (model.isEnabled()) { 
        //System.out.println("isEnabled"); 
       } else if (model.isPressed()) { 
        //System.out.println("isPressed"); 
       } else if (model.isRollover()) { 
        //System.out.println("isRollover"); 
       } else if (model.isSelected()) { 
        //System.out.println("isSelected"); 
       } 
      } 
     }); 
     myMenuItem2.addMenuKeyListener(myMenuKeyListener); 

     popup.add(myMenuItem1); 
     popup.add(myMenuItem2); 
     MouseListener popupListener = new PopupListener(popup); 
     table.addMouseListener(popupListener); 
     popup.setLightWeightPopupEnabled(false); 
     PopupMenuListener popupMenuListener = new MyPopupMenuListener(); 
     popup.addPopupMenuListener(popupMenuListener); 
    } 

    private class PopupListener extends MouseAdapter { 

     private JPopupMenu popup; 

     PopupListener(JPopupMenu popupMenu) { 
      popup = popupMenu; 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      maybeShowPopup(e); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      if (table.getSelectedRow() != -1) { 
       maybeShowPopup(e); 
      } 
     } 

     private void maybeShowPopup(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     } 
    } 

    private class MyMenuKeyListener implements MenuKeyListener { 

     public void menuKeyTyped(MenuKeyEvent e) { 
      MenuElement[] path = e.getPath(); 
      JMenuItem item = (JMenuItem) path[path.length - 1]; 
      System.out.println("Key typed: " + e.getKeyChar() 
        + ", " + MenuKeyEvent.getKeyText(e.getKeyCode()) 
        + " on " + item.getText()); 
     } 

     public void menuKeyPressed(MenuKeyEvent e) { 
      MenuElement[] path = e.getPath(); 
      JMenuItem item = (JMenuItem) path[path.length - 1]; 
      System.out.println("Key typed: " + e.getKeyChar() 
        + ", " + MenuKeyEvent.getKeyText(e.getKeyCode()) 
        + " on " + item.getText()); 
     } 

     public void menuKeyReleased(MenuKeyEvent e) { 
      MenuElement[] path = e.getPath(); 
      JMenuItem item = (JMenuItem) path[path.length - 1]; 
      System.out.println("Key typed: " + e.getKeyChar() 
        + ", " + MenuKeyEvent.getKeyText(e.getKeyCode()) 
        + " on " + item.getText()); 
     } 
    } 

    private class MyPopupMenuListener implements PopupMenuListener { 

     public void popupMenuCanceled(PopupMenuEvent popupMenuEvent) { 
      //System.out.println("Canceled"); 
     } 

     public void popupMenuWillBecomeInvisible(PopupMenuEvent popupMenuEvent) { 
      //System.out.println("Becoming Invisible"); 
     } 

     public void popupMenuWillBecomeVisible(PopupMenuEvent popupMenuEvent) { 
      //System.out.println("Becoming Visible"); 
     } 
    } 

    public static void main(String[] args) { 
     /*SwingUtilities.invokeLater(new Runnable() { 

     public void run() { 
     SubstanceLookAndFeel.setSkin(new BusinessBlueSteelSkin()); 
     } 
     });*/ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
      /*UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());*/ 
     } catch (ClassNotFoundException ex) { 
     } catch (InstantiationException ex) { 
     } catch (IllegalAccessException ex) { 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     } 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TableCheckBox frame = new TableCheckBox(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocation(150, 150); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

我在我的Mac上試過這段代碼,並且完美地工作(進入和空格鍵都在運行)!但我試着在我的代碼上打印更改偵聽器,輸入不會觸發任何更改! – rozagh

+0

@ trashgod對不起劫持,請你能... – mKorbel

+0

我也試過Nimbus的外觀和感覺,但仍然菜單不聽進入! – rozagh

0

您需要將一個KeyListener添加到JMenuItem中,並將該項設置爲可調焦。有你的JMenuItem請求焦點與

JMenuItem.requestFocus(); 

當它具有焦點時,implemtation容易

在你的KeyListener:

 @Override 
     public void keyReleased(KeyEvent e) { 
      if (e.getKeyCode() == e.VK_ENTER) { 
       // do stuff 
      } 

     } 
+1

我剛試過這個,但沒有工作,菜單項不聽重點事件! – rozagh

+0

@ user1475727很奇怪,它在JMenuBar中有效,但不是JPopUpMenu,我會查看它 –

+0

沒錯,菜單欄對我的應用程序來說工作正常! – rozagh

1

ImageApp似乎使用Action兩個項目加入到正常工作菜單欄和通過setComponentPopupMenu()添加到上下文菜單的項目。 輸入空格從菜單欄或上下文菜單中調出所選菜單項。

另外,請注意使用getMenuShortcutKeyMask()作爲跨平臺MASK

+0

謝謝你的回答+1 – mKorbel

+0

@rozagh:我懷疑問題出在看不見的代碼中。如果你能產生一個表現問題的[sscce](http://sscce.org/),我會嘗試運行它。隨意使用我的例子作爲基礎。 – trashgod

+0

我的代碼中的彈出式菜單和菜單項是基於鼠標事件位置生成的,並使用'show(x,y)'方法引發。該菜單無法附加到特定組件。你認爲使用'show(x,y)'是問題的根源嗎? – rozagh