2013-03-19 73 views
0

嗨,我的代码到目前为止是这样的:点击一个按钮,打开一个组合框。我想在ComboBox上选择一个选项,并根据选择哪个选项,我想使用getSelectIndex()打开另一个组合框。从另一个类的方法创建一个actionlistener

这里是我的代码的部分是相关的。我知道我必须让其他组合框不可见或被删除,但目前我只是想让组合框出现。正如你所看到的,我已经插入了按钮的actionlistener,它可以工作并打开组合框。但是,在组合框中选择一个字符串时,不会发生任何事件。但是,当我运行它时,不会出现组合框。

public class Work extends JFrame { 
// variables for JPanel 

    private JPanel buttonPanel; 
    private JButton timeButton; 

    public Work() 
{ 
     setLayout(new BorderLayout()); 

     buttonPanel = new JPanel(); 
    buttonPanel.setBackground(Color.RED); 
    buttonPanel.setPreferredSize(new Dimension(400, 500)); 
     add(buttonPanel,BorderLayout.WEST); 
     timeButton = new JButton("Time"); 
    buttonPanel.add(timeButton); 


    buttontime clickTime = new buttontime(); // event created when time button is clicked 
    timeButton.addActionListener(clickTime); 

    Time timeObject = new Time(); 
    timeObject.SelectTime(); 
    buttontime2 selectDest = new buttontime2(); 
    timeObject.getAirportBox().addActionListener(selectDest); 



    } 



     public class buttontime implements ActionListener { //creating actionlistener for clicking on timebutton to bring up a combobox 
    public void actionPerformed(ActionEvent clickTime) { 
      Time timeObject = new Time(); 
      timeObject.SelectTime(); 
      add(timeObject.getTimePanel(),BorderLayout.EAST); 
      timeObject.getTimePanel().setVisible(true); 
      timeObject.getTimePanel().revalidate() ; 
      timeObject.getAirportBox().setVisible(true); 


    } 
    } 





      public class buttontime2 implements ActionListener{ 
    public void actionPerformed(ActionEvent selectDest) { 
    Time timeObject = new Time(); 
    timeObject.SelectTime(); 


    if(timeObject.getAirportBox().getSelectedIndex() == 1) { 



    timeObject.getEastMidBox().setVisible(true); 

    } 

    else if(timeObject.getAirportBox().getSelectedIndex() == 2) { 

    timeObject.getBirmBox().setVisible(true); 
} 
    else if(timeObject.getAirportBox().getSelectedIndex() == 3) { 

    timeObject.getMancbox().setVisible(true); 
    } 
    else if(timeObject.getAirportBox().getSelectedIndex() == 4) { 
timeObject.getHeathBox().setVisible(true); 
    } 

    } 
    } 



public static void main (String args[]) { 
events mainmenu = new events(); //object is created 


mainmenu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
mainmenu.setSize(800,500); 
mainmenu.setVisible(true); 
mainmenu.setLayout(new BorderLayout()); 
mainmenu.setTitle("Learning how to use GUI"); 
mainmenu.setBackground(Color.BLUE); 
mainmenu.setResizable(false); 

} 
} 

我其他的上课时间

  import javax.swing.JOptionPane; 

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

class Time 
{ 

    private JComboBox timeAirportbox;//comboboxes declared 
    private JComboBox eastMidbox; 
    private JComboBox mancBox; 
    private JComboBox heathBox; 
    private JComboBox birmBox; 
    private String[] airport = {"","EM", "Bham", "Manc", "Heath"};//array of airports declared 
    private String[] destination = {"","NY", "Cali", "FlO", "MIAMI", "Tokyo"};//array  of destinations declared 
    private JPanel timePanel; 

    public void SelectTime() { 



//combobox objects created 

    timePanel = new JPanel(); 
    timePanel.setBackground(Color.BLUE); 
    timePanel.setPreferredSize(new Dimension(400, 400)); 

    timeAirportbox = new JComboBox(airport);//array is inserted into the JComboBox 
    timePanel.add(timeAirportbox); 
    timeAirportbox.setVisible(false); 


    eastMidbox = new JComboBox(destination); 
    timePanel.add(eastMidbox); 
    eastMidbox.setVisible(false); 

    mancBox = new JComboBox(destination); 
    timePanel.add(mancBox); 
    mancBox.setVisible(false); 

    heathBox = new JComboBox(destination); 
    timePanel.add(heathBox); 
    heathBox.setVisible(false); 

    birmBox = new JComboBox(destination); 
    timePanel.add(birmBox); 
    birmBox.setVisible(false); 




} 



    public JPanel getTimePanel() { 
    return timePanel; 
    } 

    public JComboBox getAirportBox() { 
    return timeAirportbox;  
    } 

    public JComboBox getEastMidBox() { 
    return eastMidbox; 
    }  

    public JComboBox getMancbox() { 
    return mancBox; 
    } 

    public JComboBox getHeathBox() { 
    return heathBox; 
    } 

    public JComboBox getBirmBox() { 
    return birmBox; 
    }  





    } 

回答

2

内置在工作构造方法中没有使用的时间对象:

Time timeObject = new Time(); 
    timeObject.SelectTime(); 
    buttontime2 selectDest = new buttontime2(); 
    timeObject.getAirportBox().addActionListener(selectDest); 

当你只将动作监听selectedDest到ComboBox没有使用的时间对象,那么监听器将永远不会被调用。

你可以做两件事情,使其工作:

  • 将创建监听器的代码,并在第一个监听buttontime
  • 分配给COMBOX创建时间对象一次并储存起来作为您的Work实例的成员。由于您的侦听器是Work类的非静态内部类,它将能够使用它而不是创建新的Time对象。

编辑:我没有看到,在你的第二个听众,你又建立一个新的Time对象。这个对象实际上与之前创建的对象不同,因此修改对象不会影响其他对象。您应该创建一次Time对象并将其存储为Work类的成员变量,然后在侦听器中使用此对象而不是重新创建它。

需要明确的是,像这样做:

public class Work extends JFrame { 

    // ... 

    private Time timeObject; 

    public Work() { 

     // ... 

     timeObject = new Time(); 
     timeObject.SelectTime(); 
     buttontime2 selectDest = new buttontime2(); 
     timeObject.getAirportBox().addActionListener(selectDest); 

    } 

    public class buttontime implements ActionListener { 
     public void actionPerformed(ActionEvent clickTime) { 
      // use timeObject, don't create it and don't call SelectTime() 
      // example: 
      add(timeObject.getTimePanel(),BorderLayout.EAST); 
      // .... 
     } 
    } 

    public class buttontime2 implements ActionListener { 
     public void actionPerformed(ActionEvent clickTime) { 
      // use timeObject, don't create it and don't call SelectTime() 

     } 
    } 
} 

另外要注意:

  • 你不应该扩展JFrame的,没有理由这样做。重构您的代码,以便您的框架只是Work类的成员变量。
  • 跟着Java standard code conventions,特别是类名正确的用例:buttonlistener应该是ButtonListener,方法应该以小写字母开头:SelectTime应该是selectTime
+0

感谢您的回复,我会去看看我能否做到这一点。我很困惑的对象的概念,虽然我怎么可以存储这个作为一个成员变量 – user2188332 2013-03-19 21:24:08

+0

非常感谢你扩大了我的理解 – user2188332 2013-03-19 21:28:33

相关问题