如何为jcombobox中的每个值创建加法赋值?

w80xi6nr  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(359)

我有一个jcombobox,其中包含一个带有月份的enum类和一个jtextfield(txthours),用于输入每个月完成的工时量。
我有另一个jlabel,它持有下面所有月份的总值

double hours = Double.parseDouble(txtHours.getText());

yearHours += hours;
yLabel.setText("Hours this year: " + yearHours);

如何保存和更新特定月份的小时数,以便根据从组合框中选择的月份在运行时更新标签本身?

if (e.getSource() == cmbMonths){

       mLabel.setText("Hours for " + cmbMonths.getSelectedItem() +": " + monthHours);

    }
mf98qq94

mf98qq941#

回答你的问题,即
如何保存和更新特定月份的小时数
我会用一张Map Map 关键字是月份,值是该月份的总工作小时数。在Java1.8中添加的日期时间api中,有一个月枚举,因此我将使用它作为 Map 钥匙。
而不是使用 JTextField 要输入工作时间,我将使用jspinner。
为了更新总工作时间,我将向 JSpinner 因此,每次更改其值时 JLabel 显示总工时将得到更新,以便显示新的总工时。
剩下的唯一一件事就是将actionlistener添加到 JComboBox 这样,每当用户选择特定月份时,它都会显示输入的总工时值。
这是一个最小的,可复制的例子。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Month;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class EnumCombo implements ActionListener, ChangeListener, Runnable {
    private Map<Month, Double>  hoursWorked;
    private JComboBox<Month>  monthsCombo;
    private JFrame  frame;
    private JLabel  totalHoursLabel;
    private JSpinner  hoursSpinner;

    public EnumCombo() {
        hoursWorked = new HashMap<Month, Double>(12);
        for (Month month : Month.values()) {
            hoursWorked.put(month, Double.valueOf(0));
        }
    }

    @Override // java.awt.event.ActionListener
    public void actionPerformed(ActionEvent event) {
        Object source = event.getSource();
        if (source instanceof JComboBox<?>) {
            JComboBox<?> combo = (JComboBox<?>) source;
            Object obj = combo.getSelectedItem();
            if (obj instanceof Month) {
                Month month = (Month) obj;
                hoursSpinner.setValue(hoursWorked.get(month));
            }
        }
    }

    @Override // javax.swing.event.ChangeListener
    public void stateChanged(ChangeEvent evt) {
        Object source = evt.getSource();
        if (source instanceof SpinnerNumberModel) {
            SpinnerNumberModel snm = (SpinnerNumberModel) source;
            Object obj = snm.getValue();
            if (obj instanceof Double) {
                Double value = (Double) obj;
                hoursWorked.put((Month) monthsCombo.getSelectedItem(), value);
                Double total = hoursWorked.values()
                                          .stream()
                                          .reduce(Double.valueOf(0),
                                                  (tot, val) -> tot + val);
                totalHoursLabel.setText(total.toString());
            }
        }
    }

    @Override
    public void run() {
        showGui();
    }

    private JPanel createInputPanel() {
        JPanel inputPanel = new JPanel();
        JLabel monthLabel = new JLabel("Month");
        inputPanel.add(monthLabel);
        monthsCombo = new JComboBox<Month>(Month.values());
        monthsCombo.addActionListener(this);
        inputPanel.add(monthsCombo);
        JLabel hoursLabel = new JLabel("Hours Worked");
        inputPanel.add(hoursLabel);
        SpinnerNumberModel snm = new SpinnerNumberModel(Double.valueOf(0),
                                                        Double.valueOf(0),
                                                        Double.valueOf(999),
                                                        Double.valueOf(1));
        snm.addChangeListener(this);
        hoursSpinner = new JSpinner(snm);
        inputPanel.add(hoursSpinner);
        return inputPanel;
    }

    private JPanel createTotalPanel() {
        JPanel totalPanel = new JPanel();
        JLabel label = new JLabel("Total Hours");
        totalPanel.add(label);
        totalHoursLabel = new JLabel("0");
        totalPanel.add(totalHoursLabel);
        return totalPanel;
    }

    private void showGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createInputPanel(), BorderLayout.PAGE_START);
        frame.add(createTotalPanel(), BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new EnumCombo());
    }
}

注意这个方法 stateChanged ,在上面的代码中,使用了同样在Java1.8中添加的流api
下面是运行应用程序的屏幕截图。

相关问题