2

フレームとメニュー項目にポップアップメニューを表示することができました。ラジオボタンのグループは、矢印キーでナビゲートできます。ユーザーがEnter/Returnを押すと、ポップアップメニューが表示されなくなり、選択されたボタンを判別してアクションを割り当てることができると思います。

    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キーを押す前に、どのラジオボタンが選択されたかを確認するにはどうすればよいですか?

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をpopupandmonitorメソッドに実装する必要があります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 に答える