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

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

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

  1. double hours = Double.parseDouble(txtHours.getText());
  2. yearHours += hours;
  3. yLabel.setText("Hours this year: " + yearHours);

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

  1. if (e.getSource() == cmbMonths){
  2. mLabel.setText("Hours for " + cmbMonths.getSelectedItem() +": " + monthHours);
  3. }
mf98qq94

mf98qq941#

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

  1. import java.awt.BorderLayout;
  2. import java.awt.EventQueue;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.time.Month;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import javax.swing.JComboBox;
  9. import javax.swing.JFrame;
  10. import javax.swing.JLabel;
  11. import javax.swing.JPanel;
  12. import javax.swing.JSpinner;
  13. import javax.swing.SpinnerNumberModel;
  14. import javax.swing.event.ChangeEvent;
  15. import javax.swing.event.ChangeListener;
  16. public class EnumCombo implements ActionListener, ChangeListener, Runnable {
  17. private Map<Month, Double> hoursWorked;
  18. private JComboBox<Month> monthsCombo;
  19. private JFrame frame;
  20. private JLabel totalHoursLabel;
  21. private JSpinner hoursSpinner;
  22. public EnumCombo() {
  23. hoursWorked = new HashMap<Month, Double>(12);
  24. for (Month month : Month.values()) {
  25. hoursWorked.put(month, Double.valueOf(0));
  26. }
  27. }
  28. @Override // java.awt.event.ActionListener
  29. public void actionPerformed(ActionEvent event) {
  30. Object source = event.getSource();
  31. if (source instanceof JComboBox<?>) {
  32. JComboBox<?> combo = (JComboBox<?>) source;
  33. Object obj = combo.getSelectedItem();
  34. if (obj instanceof Month) {
  35. Month month = (Month) obj;
  36. hoursSpinner.setValue(hoursWorked.get(month));
  37. }
  38. }
  39. }
  40. @Override // javax.swing.event.ChangeListener
  41. public void stateChanged(ChangeEvent evt) {
  42. Object source = evt.getSource();
  43. if (source instanceof SpinnerNumberModel) {
  44. SpinnerNumberModel snm = (SpinnerNumberModel) source;
  45. Object obj = snm.getValue();
  46. if (obj instanceof Double) {
  47. Double value = (Double) obj;
  48. hoursWorked.put((Month) monthsCombo.getSelectedItem(), value);
  49. Double total = hoursWorked.values()
  50. .stream()
  51. .reduce(Double.valueOf(0),
  52. (tot, val) -> tot + val);
  53. totalHoursLabel.setText(total.toString());
  54. }
  55. }
  56. }
  57. @Override
  58. public void run() {
  59. showGui();
  60. }
  61. private JPanel createInputPanel() {
  62. JPanel inputPanel = new JPanel();
  63. JLabel monthLabel = new JLabel("Month");
  64. inputPanel.add(monthLabel);
  65. monthsCombo = new JComboBox<Month>(Month.values());
  66. monthsCombo.addActionListener(this);
  67. inputPanel.add(monthsCombo);
  68. JLabel hoursLabel = new JLabel("Hours Worked");
  69. inputPanel.add(hoursLabel);
  70. SpinnerNumberModel snm = new SpinnerNumberModel(Double.valueOf(0),
  71. Double.valueOf(0),
  72. Double.valueOf(999),
  73. Double.valueOf(1));
  74. snm.addChangeListener(this);
  75. hoursSpinner = new JSpinner(snm);
  76. inputPanel.add(hoursSpinner);
  77. return inputPanel;
  78. }
  79. private JPanel createTotalPanel() {
  80. JPanel totalPanel = new JPanel();
  81. JLabel label = new JLabel("Total Hours");
  82. totalPanel.add(label);
  83. totalHoursLabel = new JLabel("0");
  84. totalPanel.add(totalHoursLabel);
  85. return totalPanel;
  86. }
  87. private void showGui() {
  88. frame = new JFrame();
  89. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  90. frame.add(createInputPanel(), BorderLayout.PAGE_START);
  91. frame.add(createTotalPanel(), BorderLayout.PAGE_END);
  92. frame.pack();
  93. frame.setLocationByPlatform(true);
  94. frame.setVisible(true);
  95. }
  96. public static void main(String[] args) {
  97. EventQueue.invokeLater(new EnumCombo());
  98. }
  99. }

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

展开查看全部

相关问题