【问题标题】:Eventhandling and how to use itemListener for multiple items事件处理以及如何将 itemListener 用于多个项目
【发布时间】:2015-09-22 06:43:06
【问题描述】:

所以我有2个问题,以下关于我将要问的问题的课程补充如下:

1) 如果我有多个 JCheckBox,我如何使用 itemListener 知道何时选择了特定的 JCheckBox。 (在下面的示例中,我有 3 个名为汽油、电动和柴油的 JCheckBox,如果选择了汽油,我怎么能意识到这一点,我想做一些事情,如果选择了汽油,则从 JComboBox 中删除一些项目)

2) 如何在单击 JButton 时使进度条增大或减小。在下面的代码中,我有一个 JProgressBar,当用户单击驱动器时,我希望 JProgressBar 减少,当他们选择加油时,我希望 JProgressBar 增加。我有点希望 JProgressBar 代表汽车的燃料水平。我该怎么做呢?

1 级

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

public class CarViewer extends JFrame{



//row1
JPanel row1 = new JPanel();
JButton drv = new JButton("Drive");
JButton park = new JButton("Park");
JButton refuel = new JButton("Refuel");
//row2
JPanel row2 = new JPanel();
JLabel carTypeTag = new JLabel("Car Model:", JLabel.RIGHT);
JComboBox<String> options = new JComboBox<String>();
JCheckBox petrol = new JCheckBox("Petrol");
JCheckBox Electric = new JCheckBox("Electric");
JCheckBox diesel = new JCheckBox("Diesel");
JLabel fuelTypeTag = new JLabel("Fuel Type: ", JLabel.RIGHT);
ButtonGroup groupFuelType = new ButtonGroup();
//row3
JPanel row3 = new JPanel();
JLabel costTag = new JLabel("Cost:", JLabel.RIGHT);
JTextField costField = new JTextField(10);
JLabel engTag = new JLabel("Engine Size: ", JLabel.RIGHT);
JTextField engField = new JTextField(5);
JLabel mileageTag = new JLabel("Mileage: ", JLabel.RIGHT);
JTextField mField = new JTextField(10);
JLabel tankSizeTag = new JLabel("Tank size: ", JLabel.RIGHT);
JTextField tSField = new JTextField(5);
//row4
JPanel row4 = new JPanel();
JProgressBar petTank = new JProgressBar();
//row5
JPanel row5 = new JPanel();
JButton reset = new JButton("Reset");

public CarViewer(){
    super("Analyse A Car - AAC");
    setSize(400,800);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout layoutMaster = new GridLayout(6, 1, 10, 20);
    setLayout(layoutMaster);
    ////Initial Errands
    groupFuelType.add(petrol);
    groupFuelType.add(diesel);
    groupFuelType.add(Electric);
    Dimension buttonDimension = new Dimension(80,30);
    Dimension resetButtonX = new Dimension(150,100);
    drv.setPreferredSize(buttonDimension);
    park.setPreferredSize(buttonDimension);
    refuel.setPreferredSize(buttonDimension);   
    petTank.setMinimum(0);
    petTank.setMaximum(100);


            ///Adding Car Models to Dropdown (JComboBox)
            options.addItem("Mercedes C63 AMG");
            options.addItem("BMW i7");
            options.addItem("Jaguar XFR");
            options.addItem("Nissan Skyline R35 GTR 4");
            EmptyBorder empty0 = new EmptyBorder(60, 0, 440, 0); //empty Border;
            EmptyBorder empty2 = new EmptyBorder(50,40,0,120); //empty Border row 3;
            EmptyBorder empty4 = new EmptyBorder(80,0,0,0);
            //Errands Complete

        CarEvent handler = new CarEvent();

        //Adding Listeners
        drv.addActionListener(handler);
        park.addActionListener(handler);
        refuel.addActionListener(handler);
        reset.addActionListener(handler);
        options.addItemListener(handler);
        petrol.addItemListener(handler);
        Electric.addItemListener(handler);
        diesel.addItemListener(handler);
        //Listeners Added.




    FlowLayout layout0 = new FlowLayout();
    row1.setLayout(layout0);
    row1.add(drv);
    row1.add(park);
    row1.add(refuel);
    row1.setBorder(empty0);
    add(row1);

    GridLayout layout1 = new GridLayout(1, 3, 40, 50);
    row2.setLayout(layout1);
    row2.add(carTypeTag);
    row2.add(options);
    row2.add(fuelTypeTag);
    row2.add(petrol);
    row2.add(diesel);
    row2.add(Electric);
    add(row2);

    GridLayout layout2 = new GridLayout(1, 4, 20, 0);
    row3.setLayout(layout2);
    costField.setEditable(false);
    engField.setEditable(false);
    tSField.setEditable(false);
    mField.setEditable(false);
    row3.add(costTag);
    row3.add(costField);
    row3.add(engTag);
    row3.add(engField);
    row3.add(tankSizeTag);
    row3.add(tSField);
    row3.add(mileageTag);
    row3.add(mField);
    row3.setBorder(empty2);
    add(row3);

    FlowLayout layout3 = new FlowLayout(FlowLayout.CENTER);
    row4.setLayout(layout3);
    row4.setBorder(empty4);
    row4.add(petTank);
    add(row4);

    FlowLayout layout4 = new FlowLayout(FlowLayout.CENTER);
    row5.setLayout(layout4);
    reset.setPreferredSize(resetButtonX);
    row5.add(reset);
    add(row5);

    setVisible(true);



}


public static void main(String[] args){
    CarViewer gui = new CarViewer();
}
}

事件处理类(二):

    import java.awt.event.*;

public class CarEvent implements ActionListener, ItemListener {

public void actionPerformed(ActionEvent event){
    String cmd = event.getActionCommand();
    if(cmd.equals("Drive"));{

    }
    else if(cmd.equals("Park")){

    }
    else if(cmd.equals("Refuel")){

    }

    else if(cmd.equals("Reset")){

    }
}

public void itemStateChanged(ItemEvent event){
    Object identifier = event.getItem();
    String item = identifier.toString();

    if())
}   

}

【问题讨论】:

  • 请回去学习面向对象的原则。封装可能是一个不错的选择。

标签: java swing user-interface events listeners


【解决方案1】:

对于复选框问题,以下代码可能会对您有所帮助。

  1. 使用 CarEvent 类作为 CarViewer 的内部类。

  2. 在 CarViewer 中为每个控件添加事件

    public class CarViewer extends JFrame {
        petrol.addItemListener (new CarEvent());
        Electric.addItemListener (new CarEvent());
        diesel.addItemListener (new CarEvent());
    
    
    class CarEvent implements ActionListener, ItemListener {
    
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.toString());
    }
    
    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getItem().equals(petrol)) {
            System.out.println("Petrol");
        }
        else if (e.getItem().equals(Electric)) {
            System.out.println("Electric");
        }
        else if (e.getItem().equals(diesel)) {
            System.out.println("Diesel");
        }
    }
    } //CarEvent class
    

    } //CarViewer 类

如果要将 CarEvent 用作单独的类,则需要将 CarViewer 类实例传递给此 CarEvent 类并访问复选框(当复选框为公共时)

public class CarViewer extends JFrame {
    petrol.addItemListener (new CarEvent(this));
    //and so on ,,,,
}//CarViewer class

class CarEvent implements ActionListener, ItemListener {
      CarViewer cv:
      public CarEvent(CarViewer _object){
            cv=_object;
      }

      @Override
public void actionPerformed(ActionEvent e) {
    System.out.println(e.toString());
}

@Override
public void itemStateChanged(ItemEvent e) {
    if (e.getItem().equals(cv.petrol)) {
        System.out.println("Petrol");
    }
    else if (e.getItem().equals(cv.Electric)) {
        System.out.println("Electric");
    }
    else if (e.getItem().equals(cv.diesel)) {
        System.out.println("Diesel");
    }
}
    }//CarEvent class

【讨论】:

  • 当被作为 CarEvent 构造函数的参数时,你能解释一下'this'的目的是什么
  • 当我们使用 CarEvent 作为单独的类时,我们可以只使用它的类来访问汽油复选框。例如 this.petrol (carviewer.petrol)。
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 2012-01-10
  • 2023-03-27
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2016-09-18
相关资源
最近更新 更多