2012-08-27 23 views
2

我已经能够在我的框架和菜单项中显示一个弹出菜单,一组单选按钮可以用箭头键导航。当用户按Enter/Return时,弹出式菜单不再可见,我认为可以确定选择哪个按钮并分配一个动作。如何捕捉用户在jpopupmenu中选择jradiobutton?

private static final JPopupMenu popupSyncTIR = new JPopupMenu(); 
    popupSyncTIR.setLabel("Sensor Synced to Clock"); 
    ButtonGroup grpTIR = new ButtonGroup(); 
    JRadioButtonMenuItem rbTIRMenuItem; 
    rbTIRMenuItem = new JRadioButtonMenuItem("Sync TIR-A to clock"); 
    rbTIRMenuItem.setFont(new Font("Dialog", Font.BOLD, 16)); 
    grpTIR.add(rbTIRMenuItem); 
    popupSyncTIR.add(rbTIRMenuItem); 
    rbTIRMenuItem = new JRadioButtonMenuItem("Sync TIR-B to clock"); 
    rbTIRMenuItem.setFont(new Font("Dialog", Font.BOLD, 16)); 
    rbTIRMenuItem.setSelected(true); 
    grpTIR.add(rbTIRMenuItem); 
    popupSyncTIR.add(rbTIRMenuItem); 
    rbTIRMenuItem = new JRadioButtonMenuItem("Sync TIR-C to clock"); 
    rbTIRMenuItem.setFont(new Font("Dialog", Font.BOLD, 16)); 
    grpTIR.add(rbTIRMenuItem); 
    popupSyncTIR.add(rbTIRMenuItem); 

我还实施了键映射整个框架是这样的:

/** 
* alt-T period synch TIR sensor w/clock 
*/ 
@SuppressWarnings("serial") 
private static void registerSyncTIRAction() { 
    javax.swing.Action tirSync = new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      setTIRSensorSync(); 
     } 
    }; 
    KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_T, 
      java.awt.event.InputEvent.ALT_DOWN_MASK); 
    ((JComponent) contentPanel).getActionMap().put("TirSync", tirSync); 
    ((JComponent) contentPanel).getInputMap(
      JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "TirSync"); 

} 

/** 
* Show the TIR popup 
*/ 
private static void setTIRSensorSync() { 
    popupSyncTIR.show(pnlTIR, 10, 10); 
} 

如何确定之前用户按下Enter键选择什么样的单选按钮?

+0

为了更好地提供帮助,请发布[SSCCE](http://sscce.org/)。 –

回答

4

就在同一组件层次,你会与单选按钮其不在使用:-)动作的菜单:

Action actionA = new AbstractAction("Synch A to clock") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // do stuff A 
    } 
}; 
JRadioButtonMenuItem buttonA = new JRadioButtonMenuItem(actionA); 
Action actionB = new AbstractAction("Synch B to clock") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // do stuff B 
    } 
}; 
JRadioButtonMenuItem buttonB = new JRadioButtonItem(actionB); 
ButtonGroup ... // add buttons to group 
JPopupMenu ... // add buttons to menu 
+0

哈哈哈,好点 – MadProgrammer

+0

愚蠢的问题(对不起,机器人在电脑前在莫),动作事件会导致弹出窗口关闭或不?没有理由询问他人好奇 – MadProgrammer

+0

没有在API中实现鼠标或键盘事件,弹出窗口始终关闭(从Java1.4开始)不添加监听器 – mKorbel

0

结果的值仍然存储在您添加到弹出菜单的组件中。

您需要实施PopupMenuListener到您的弹出窗口并且监视popupMenuWillBecomeInvisible方法。

当被调用时,您需要询问您在弹出菜单中选择的组件的组件。

如果您仍然直接引用它们(即在类上下文中),则可以直接访问它们。

通过对弹出式菜单进行子分类可以实现下一个最佳效果。

public class ChoicesPopupMenu exends JPopupMenu { 

    JRadioButtonMenuItem rbAClock; 
    JRadioButtonMenuItem rbBClock; 
    JRadioButtonMenuItem rbCClock; 

    // Construct the UI ... 

    public boolean isAClockSelected() { 
     return rbAClock.isSelected(); 
    } 

    // Other selection checkers... 

} 

或者,你可以走的JPopupMenu

public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
    JPopupMenu menu = (JPopupMenu)e.getSource(); 
    for (Component comp : menu.getComponents()) { 
     if (comp instanceof JRadioButton) { 
      JRadioButton rb = (JRadioButton)comp; 
      if (rb.isSelected()) { 
       // Figure out which one is selected... 
      } 
     } 
    } 
} 
+0

呃...不,不需要popupMenuListener。 – kleopatra