1

メニューにチェックボックスグループを追加しようとしていますが、「シンボルが見つかりません」というエラーが表示され続けます。

    MenuBar mb = new MenuBar();
    Menu file = new Menu("File");
    Menu colorM = new Menu("Color");
    MenuItem quitM = new MenuItem("Quit", new MenuShortcut(KeyEvent.VK_Q));
    CheckboxGroup cbg = new CheckboxGroup();
    Checkbox cb1 = new Checkbox("Black",cbg,true);
    Checkbox cb2 = new Checkbox("Red",cbg,false);
    Checkbox cb3 = new Checkbox("Blue",cbg,false);
    Checkbox cb4 = new Checkbox("Green",cbg,false);

それから私の初期化で私は持っています

    chatF.setMenuBar(mb);
    mb.add(file);
    mb.add(colorM);
    file.add(quitM);
    colorM.add(cbg);

MenuItemを追加して、そこにcbgを入れてみましたが、同じ問題が発生しました

4

4 に答える 4

1

メニューに を追加することはできませんCheckboxGroup...MenuItemインスタンスを追加することしかできません。を追加できますがCheckboxMenuItem、これも理解できませんCheckboxGroup

したがって、CheckBoxs をCheckboxMenuItems に変更し、個別にメニューに追加し、独自のCheckboxMenuItemGroupクラスをロールして、それを使用して s をバインドする必要がありますCheckboxMenuItem

次のようなものが機能するはずです。

public class CheckboxMenuItemGroup implements ItemListener {

    private Set<CheckboxMenuItem>   items = new HashSet<CheckboxMenuItem>();

    public void add(CheckboxMenuItem cbmi) {
        cbmi.addItemListener(this);
        cbmi.setState(false);
        items.add(cbmi);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            String itemAffected = (String) e.getItem();
            for (CheckboxMenuItem item : items) {
                // Use this line to allow user to toggle the selected item off
                if (!item.getLabel().equals(itemAffected)) item.setState(false);
                // Use this line to force one of the items to always be selected
                // item.setState(item.getLabel().equals(itemAffected));
            }
        }
    }

    public void selectItem(CheckboxMenuItem itemToSelect) {
        for (CheckboxMenuItem item : items) {
            item.setState(item == itemToSelect);
        }
    }

    public CheckboxMenuItem getSelectedItem() {
        for (CheckboxMenuItem item : items) {
            if (item.getState()) return item;
        }
        return null;
    }
}

ItemListenerコードが を呼び出すときに s が呼び出されitem.setState()ず、ユーザーがメニューの項目をクリックしたときにのみ呼び出されるため、これは機能するはずです。呼び出しでアイテムの状態のみを設定するようにしてくださいCheckboxMenuItemGroup.selectItem()。そうしないと、複数のアイテムが選択される可能性があります。

次に、次のようにメニューを作成する必要があります。

public static void main(String[] args) {

    final Frame f = new Frame("Test CheckboxMenuItemGroup");
    MenuBar mb = new MenuBar();
    Menu menu = new Menu("Menu");
    CheckboxMenuItem cb1 = new CheckboxMenuItem("Black");
    CheckboxMenuItem cb2 = new CheckboxMenuItem("Red");
    CheckboxMenuItem cb3 = new CheckboxMenuItem("Blue");
    CheckboxMenuItem cb4 = new CheckboxMenuItem("Green");

    CheckboxMenuItemGroup mig = new CheckboxMenuItemGroup();
    mig.add(cb1);
    mig.add(cb2);
    mig.add(cb3);
    mig.add(cb4);
    mig.selectItem(cb1);

    menu.add(cb1);
    menu.add(cb2);
    menu.add(cb3);
    menu.add(cb4);

    f.setMenuBar(mb);

    f.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
    f.setSize(300, 200);
    f.setVisible(true);
}
于 2012-11-28T02:11:44.813 に答える
1

CheckboxGroupComponent(より具体的にはMenuItem) ではないため、メニューに追加できません。代わりに を作成できますが、 のインスタンスでのみ機能するとCheckboxMenuItem思いますので、単一選択を強制するには独自のコードを作成する必要があります。CheckboxGroupCheckbox

Swing がオプションの場合、代わりにJRadioButtonMenuItemandを使用できButtonGroupます。

package com.example.checkboxmenu;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;

public class CheckboxMenu extends JFrame {

    public CheckboxMenu() {
        JMenuBar mb = new JMenuBar();
        JMenu file = new JMenu("File"); //$NON-NLS-1$
        JMenu colorM = new JMenu("Color");
        JMenuItem quitM = new JMenuItem("Quit", KeyEvent.VK_Q);

        JRadioButtonMenuItem cb1 = new JRadioButtonMenuItem("Black", true);
        JRadioButtonMenuItem cb2 = new JRadioButtonMenuItem("Red", true);
        JRadioButtonMenuItem cb3 = new JRadioButtonMenuItem("Blue", true);
        JRadioButtonMenuItem cb4 = new JRadioButtonMenuItem("Green", true);

        ButtonGroup group = new ButtonGroup();
        group.add(cb1);
        group.add(cb2);
        group.add(cb3);
        group.add(cb4);

        setJMenuBar(mb);
        mb.add(file);
        mb.add(colorM);
        file.add(quitM);
        colorM.add(cb1);
        colorM.add(cb2);
        colorM.add(cb3);
        colorM.add(cb4);

        quitM.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400,300);
        setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new CheckboxMenu();
    }

}
于 2012-11-28T02:16:09.473 に答える
1

awtの代わりにswingを使用。

JMenuBar menuBar = new JMenuBar();
JMenu color = new JMenu("Color");

JCheckBoxMenuItem cb1 = new JCheckBoxMenuItem("Black");
JCheckBoxMenuItem cb2 = new JCheckBoxMenuItem("Red");
JCheckBoxMenuItem cb3 = new JCheckBoxMenuItem("Blue");
JCheckBoxMenuItem cb4 = new JCheckBoxMenuItem("Green");

ButtonGroup group = new ButtonGroup();
group.add(cb1);
group.add(cb2);
group.add(cb3);
group.add(cb4);

menuBar.add(cb1);
menuBar.add(cb2);
menuBar.add(cb3);
menuBar.add(cb4);

setJMenuBar(menuBar); // Set the JMenuBar of the JFrame

任意のAbstractButtonButtonGroupに追加できます。

于 2015-05-04T01:43:12.503 に答える
0

OSX Java 7 (1.7.0_40) では、Julians の回答はうまくいきません。ItemEvent によって返されるオブジェクトは実際には CheckBoxItem ではなく String であるためです。OSX のバグのように聞こえますが、itemStateChanged メソッドを変更することで機能するようになりました。

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashSet;
import java.util.Set;

public class CheckboxMenuItemGroup implements ItemListener
{

    private Set<CheckboxMenuItem> items = new HashSet<CheckboxMenuItem>();

    public void add(CheckboxMenuItem cbmi) {
        cbmi.addItemListener(this);
        cbmi.setState(false);
        items.add(cbmi);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {

            String itemAffected = (String)e.getItem();
            for (CheckboxMenuItem item : items) {
                if (item.getLabel() != itemAffected) item.setState(false);
            }
        }
    }

    public void selectItem(CheckboxMenuItem itemToSelect) {
        for (CheckboxMenuItem item : items) {
            item.setState(item == itemToSelect);
        }
    }

    public CheckboxMenuItem getSelectedItem() {
        for (CheckboxMenuItem item : items) {
            if (item.getState()) return item;
        }
        return null;
    }
}
于 2013-11-20T09:59:31.303 に答える