2012-11-28 29 views
1

我試圖添加一個複選框組到我的菜單,但不斷收到「無法找到符號」錯誤。將複選框組添加到java菜單

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

我嘗試添加一個菜單項,並把CBG在那裏,但同樣的問題

+0

如果我註釋掉colorM.add(cbg)行,所有代碼都可以編譯並運行。我目前在程序中唯一的代碼是設置UI以及添加和刪除監聽器,所以我想到了設置按鈕,標籤等的代碼是不需要的。 – user1515742

回答

1

您不能添加CheckboxGroup到菜單.. 。只能添加MenuItem實例。您可以添加一個CheckboxMenuItem,但是這也不瞭解CheckboxGroup

所以,你需要改變CheckBox s到CheckboxMenuItem S,逐個添加到菜單,推出自己CheckboxMenuItemGroup類,並用它來綁定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■不要被調用時,代碼調用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); 
} 
+0

您能否爲我解釋一點這個問題,或者您有其他可以參考的網站嗎? – user1515742

+0

首先,您只能將MenuItem添加到菜單或MenuItem的子類,例如Menu,PopupMenu(在此上下文中沒有意義),以及CheckboxMenuItem正是事物你想在這裏。但是你也希望你的'CheckboxMenuItem'是獨佔的。您不能將它們添加到「CheckboxGroup」中,因此您必須創建一個類似於「CheckboxGroup」的類,但對於「CheckboxMenuItem」,並將四個「CheckboxMenuItem」附加到它。最後,你需要將你的'CheckboxMenuItem'單獨添加到你的'Menu'中。 –

+0

我猜你此刻不使用IDE。如果您可以這樣做,我強烈建議您安裝NetBeans或Eclipse之類的程序,因爲它可以在您嘗試調用具有無效參數的方法時提醒您,並建議適當的替代方法,即使在嘗試編譯碼。 –

1

CheckboxGroup不是Component(或者更具體地說,MenuItem),所以你不能把它添加到菜單。相反,您可以創建一個CheckboxMenuItem,但我認爲CheckboxGroup僅適用於Checkbox的實例,因此您必須編寫自己的代碼來強制進行單選。

如果Swing是一個選項,你可以改用JRadioButtonMenuItemButtonGroup

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

} 
+0

不幸的是我不能在這種情況下使用擺動。當我聲明覆選框時,我將它們添加到同一行中的組中。我不知道什麼類型的菜單將接受複選框組 – user1515742

+0

我認爲你必須自己實現CheckboxGroup的功能CheckboxMenuItem。它應該相當簡單,但您必須使用偵聽器來更新其他複選框的狀態。 – rob

0

在OSX的Java 7(1.7.0_40)朱利安答案犯規相當的工作,因爲通過一個ItemEvent返回的對象實際上是一個字符串,而比CheckBoxItem,soiunds像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; 
    } 
} 
+0

非常正確 - 我自己並沒有編譯它,現在它在Linux中的JDK 1.7.0_45下的行爲似乎已經測試過了。我更新了我的代碼以反映這一點,並將該示例充實到我已實際編譯和測試的內容中!您可能希望在您的itemStateChanged()代碼中使用equals()進行字符串比較,而不是!=雖然。 –

1

使用擺動,而不是AWT的工作。

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 

您可以將任何AbstractButton添加到ButtonGroup