2

I have been able to show a popup menu in my frame and the menu items, a group of radio buttons may be navigated with the arrow keys. When the user presses Enter/Return the popup menu is no longer visible and I assume that it is possible to determine which button was chosen and assign an action.

    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);

I have also implemented key mapping for the whole frame like this:

/**
 * 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); 
}

How do I determine what radio button was selected before the user pressed Enter?

4

2 回答 2

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
于 2012-08-28T06:37:07.560 回答
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...
            }
        }
    }
}
于 2012-08-27T23:33:17.747 回答