2017-06-19 24 views
0

我正在爲我的計算機科學課做一個日曆項目。目前我正在開發一個主菜單,但我似乎遇到了一個我無法擺脫的錯誤!當我運行該程序,在下拉菜單中工作正常,但是當我點擊按鈕一堆錯誤顯示在終端上:組合框和按鈕在java中不能一起工作

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
    javax.swing.JButton cannot be cast to javax.swing.JComboBox 

似乎是主要原因之一。任何幫助,將不勝感激!你可以在下面看到我的代碼。

/*pictures used in this code were edited by Martha Ibarra. Original PNG image sources are listed below 
http://imagespng.com/Detail/1093/White-cat-PNG-Transparent-image.html 
http://www.freeiconspng.com/img/40367 
http://www.susancalman.com/wp-content/uploads/2015/11/corner-cat.png*/ 


import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class MainMenu implements ActionListener 
{ 

    private JPanel panel; 
    private JFrame frame; 
    private JButton addEvent; 
    private JButton delEvent; 
    private JLabel label; 
    private ImageIcon image; 
    TextField text = new TextField(20); 
    JLabel displayMessage = new JLabel("Select a CATlendar view or you can ADD or DELETE an event!"); 

    public MainMenu() 
    { 
    gui(); 
    } 
///draws the main menu 
    public void gui() 
    { 
    frame = new JFrame("CATlendar"); 
    frame.setVisible(true); 
    frame.setSize(600,500); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    FlowLayout lay = new FlowLayout(); 
    panel= new JPanel(); 
    panel.setBackground(Color.PINK); 
    panel.setLayout(lay); 

    addEvent = new JButton("ADD EVENT"); 
    addEvent.setPreferredSize(new Dimension(200, 200)); 
    addEvent.addActionListener(this); 
    ImageIcon catAdd = new ImageIcon(getClass().getResource("im-hungry.png")); 
    addEvent.setIcon(catAdd); 


    delEvent = new JButton("DELETE EVENT"); 
    delEvent.setPreferredSize(new Dimension(200, 200)); 
    delEvent.addActionListener(this); 
    ImageIcon catDel = new ImageIcon(getClass().getResource("tres-quatro.png")); 
    delEvent.setIcon(catDel); 

    image= new ImageIcon(getClass().getResource("uno-dos.png")); 
    label=new JLabel(image); 

    String[] viewList = { "Weekly", "Daily", "Monthly" }; 
    JComboBox viewTypes = new JComboBox(viewList); 
    viewTypes.setSelectedIndex(0); 
    viewTypes.addActionListener(this); 


    panel.add(viewTypes); 
    panel.add(label); 
    panel.add(addEvent); 
    panel.add(delEvent); 
    frame.add(panel); 
    panel.add(displayMessage); 
    panel.setVisible(true); 
    } 
    //corresponding to what the user choses to do this method will change the event hashmap or display a calendar view. 
    public void actionPerformed(ActionEvent e) 
    {  JComboBox cb = (JComboBox)e.getSource(); 
     String viewSelect = (String)cb.getSelectedItem(); 

     if(e.getActionCommand().equals("ADD EVENT")) 
     { 
      panel.add(text); 
      displayMessage.setText("Enter the date of the event you would like to delete "); 
      String eventDate = text.getText(); 
     }else if(e.getActionCommand().equals("DELETE EVENT")) 
     { 
      panel.add(text); 
      displayMessage.setText("Enter the date of the event you would like to add"); 
      String eventDelDate = text.getText(); 
     }else if(viewSelect.equals("Weekly")) 
     { 
      displayMessage.setText("You selected a weekly view"); 
     }else if(viewSelect.equals("Daily")) 
     { 
      displayMessage.setText("You selected a daily view"); 
     }else if(viewSelect.equals("Monthly")) 
     { 
      displayMessage.setText("You selected a monthly view"); 
     }else 
     { 
      displayMessage.setText("pick a view"); 
     } 
    } 
    public static void main(String [] args) 
    { 
    new MainMenu(); 
    } 

} 
+0

看起來ActionEvent的來源是JButton而不是JComboBox,因此不能轉換爲JComboBox。 –

+0

1)請參閱[什麼是堆棧跟蹤,以及如何使用它來調試我的應用程序錯誤?](http://stackoverflow.com/q/3988788/418556)2)始終在消息的主要部分搜索在堆棧跟蹤的頂部。這些問題以前已經出現過很多次了。 –

回答

1

你的問題:你嘗試存取權限的組合框的事件,如果事件的源是按鈕。如果你想在這種情況下訪問組合框,你應該提供對這個對象的引用。例如:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class MainMenu implements ActionListener 
{ 

    private JPanel panel; 
    private JFrame frame; 
    private JButton addEvent; 
    private JButton delEvent; 
    private JLabel label; 
    private ImageIcon image; 
    private JComboBox viewTypes; 
    TextField text = new TextField(20); 
    JLabel displayMessage = new JLabel("Select a CATlendar view or you can ADD or DELETE an event!"); 

    public MainMenu() 
    { 
     gui(); 
    } 
    ///draws the main menu 
    public void gui() 
    { 

     FlowLayout lay = new FlowLayout(); 
     panel= new JPanel(); 
     panel.setBackground(Color.PINK); 
     panel.setLayout(lay); 

     addEvent = new JButton("ADD EVENT"); 
     addEvent.setPreferredSize(new Dimension(200, 200)); 
     addEvent.addActionListener(this); 
     ImageIcon catAdd = new ImageIcon(getClass().getResource("im-hungry.png")); 
     addEvent.setIcon(catAdd); 


     delEvent = new JButton("DELETE EVENT"); 
     delEvent.setPreferredSize(new Dimension(200, 200)); 
     delEvent.addActionListener(this); 
     ImageIcon catDel = new ImageIcon(getClass().getResource("tres-quatro.png")); 
     delEvent.setIcon(catDel); 

     image= new ImageIcon(getClass().getResource("uno-dos.png")); 
     label=new JLabel("Test"); 

     String[] viewList = { "Weekly", "Daily", "Monthly" }; 
     viewTypes = new JComboBox(viewList); 
     viewTypes.setSelectedIndex(0); 
     viewTypes.addActionListener(this); 


     panel.add(viewTypes); 
     panel.add(label); 
     panel.add(addEvent); 
     panel.add(delEvent); 
     panel.add(displayMessage); 
     panel.setVisible(true); 
     frame = new JFrame("CATlendar"); 
     frame.setVisible(true); 
     frame.setSize(600,500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
    } 
    //corresponding to what the user choses to do this method will change the event hashmap or display a calendar view. 
    public void actionPerformed(ActionEvent e) { 
     String viewSelect = (String)viewTypes.getSelectedItem(); 

     if(e.getActionCommand().equals("ADD EVENT")) 
     { 
      panel.add(text); 
      displayMessage.setText("Enter the date of the event you would like to delete "); 
      String eventDate = text.getText(); 
     }else if(e.getActionCommand().equals("DELETE EVENT")) 
     { 
      panel.add(text);  
      displayMessage.setText("Enter the date of the event you would like to add"); 
      String eventDelDate = text.getText(); 
     }else if(viewSelect.equals("Weekly")) 
     { 
      displayMessage.setText("You selected a weekly view"); 
     }else if(viewSelect.equals("Daily")) 
     { 
      displayMessage.setText("You selected a daily view"); 
     }else if(viewSelect.equals("Monthly")) 
     { 
      displayMessage.setText("You selected a monthly view"); 
     }else 
     { 
      displayMessage.setText("pick a view"); 
     } 
     panel.revalidate(); 
     panel.repaint(); 
     SwingUtilities.windowForComponent(panel).pack(); 
    } 
    public static void main(String [] args) 
    { 
     new MainMenu(); 
    } 

}