java - 如何存储在Java中执行事件后更改的变量的最终值
问题描述
我正在使用 Swing 和 AWT 组件开发 Java 睡眠周期计算器应用程序,但我被困在这里。
我使用整数变量 a 和 b 来存储用户在滚动条上设置的时间的“小时”和“分钟”值,稍后我将使用它们来进行一些计算并显示一些数据。
但是 a 和 b 的值会自动设置为 0,并且无需等待滚动条上的调整事件执行即可完成计算。
如何在事件执行后更新 a 和 b 的值,然后将它们用于我的计算?
这是代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Sleep {
JFrame f;
JButton b1;
JLabel l3;
JLabel l4;
JLabel l5;
JLabel l6;
JButton b2;
JLabel l7;
JButton b3;
int a,b;
Sleep() {
f=new JFrame();
JPanel p2=new JPanel();
l3=new JLabel();
l3.setText("***************** RAZHA'S SLEEP CYCLE CALCULATOR *****************");
l4=new JLabel();
l4.setText("Tired of waking up exhausted ???");
l5=new JLabel("This Application calculates sleep cycles and finds the best time to wake up");
l6=new JLabel("Waking you up at the most perfect time, feeling rested!");
p2.add(l3); p2.add(l4); p2.add(l5); p2.add(l6);
p2.setBounds(700,100,500,100);
b1=new JButton("I WANT TO SLEEP AT");
b1.setBounds(800,350,300,150);
JPanel p1=new JPanel();
JLabel l1=new JLabel("Select Time (HH-MM)");
final JLabel label1 = new JLabel();
label1.setHorizontalAlignment(JLabel.CENTER);
label1.setSize(400,100);
final JLabel label2 = new JLabel();
label2.setHorizontalAlignment(JLabel.CENTER);
label2.setSize(400,100);
final JScrollBar hour=new JScrollBar(JScrollBar.VERTICAL, 2, 0, 0, 23);
final JScrollBar min=new JScrollBar(JScrollBar.VERTICAL, 2, 0, 0, 59);
hour.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
final int c=hour.getValue();
label1.setText("Hours : "+ c);
System.out.println("hr "+c);
a=c;
}
});
min.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
final int d=min.getValue();
label2.setText("Minutes : "+ d);
System.out.println("min "+d);
b=d;
}
});
p1.add(l1); p1.add(hour); p1.add(min); p1.add(label1); p1.add(label2);
p1.setBounds(780,550,340,80);
l7=new JLabel("THE BEST TIMES TO WAKE UP ARE : ");
DefaultListModel<String> lx = new DefaultListModel<>();
lx.addElement(((a+1)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 1 hr 44 min");
lx.addElement(((a+3)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 3 hrs 14 min");
lx.addElement(((a+4)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 4 hrs 44 min");
lx.addElement(((a+6)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 6 hrs 14 min");
lx.addElement(((a+7)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 7 hrs 44 min");
lx.addElement(((a+9)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 9 hrs 14 min");
lx.addElement(((a+10)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 10 hrs 44 min");
lx.addElement(((a+12)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 12 hrs 14 min");
JList<String> list = new JList<>(lx);
list.setFixedCellHeight(48);
list.setFixedCellWidth(200);
JPanel p3=new JPanel();
p3.setBounds(800,350,300,420);
p3.add(l7);
p3.add(list);
p3.setVisible(false);
b3=new JButton("EXIT");
b3.setBounds(900,800,100,50);
b3.setVisible(false);
b3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
b2=new JButton("SUBMIT");
b2.setBounds(900,650,100,50);
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
b2.setVisible(false);
b1.setVisible(false);
p1.setVisible(false);
p3.setVisible(true);
b3.setVisible(true);
}
});
f.add(b1);
f.add(b2);
f.add(p1);
f.add(p2);
f.add(p3);
f.add(b3);
f.setSize(400,400);
f.getContentPane().setBackground(Color.BLUE);
f.setLayout(null);
f.setVisible(true);
}
public static void main(String args[])
{
new Sleep();
}
}
请帮帮我。
解决方案
组件使用在和为零时创建的JList
a 初始化一次。当 和 的值在以后的某个时间点发生变化时,列表模型不会自动更改。当用户单击提交按钮 ( )时,需要使用新模型显式更新组件。ListModel
a
b
a
b
JList
b2
像这样的东西:
Sleep() {
// [...]
l7=new JLabel("THE BEST TIMES TO WAKE UP ARE : ");
JList<String> list = new JList<>();
updateTimesListModel(list);
list.setFixedCellHeight(48);
list.setFixedCellWidth(200);
// [...]
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateTimesListModel(list);
b2.setVisible(false);
b1.setVisible(false);
p1.setVisible(false);
p3.setVisible(true);
b3.setVisible(true);
}
});
// [...]
}
private void updateTimesListModel(JList<String> list) {
DefaultListModel<String> lx = new DefaultListModel<>();
lx.addElement(((a+1)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 1 hr 44 min");
lx.addElement(((a+3)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 3 hrs 14 min");
lx.addElement(((a+4)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 4 hrs 44 min");
lx.addElement(((a+6)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 6 hrs 14 min");
lx.addElement(((a+7)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 7 hrs 44 min");
lx.addElement(((a+9)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 9 hrs 14 min");
lx.addElement(((a+10)+(b+44)/60)+":"+((b+44)%60)+" - "+"Nap for 10 hrs 44 min");
lx.addElement(((a+12)+(b+14)/60)+":"+((b+14)%60)+" - "+"Nap for 12 hrs 14 min");
list.setModel(lx);
}
推荐阅读
- android - 有没有办法让 Room 在没有 AUTOINCREMENT 的情况下生成自动生成的主键?
- javascript - 点击功能内的Jasmin单元测试代码
- python - 使用 Pyspark 将密集向量转换为数据框
- arrays - 从另一个类中读取数组
- node.js - Azure CosmosDB with MongoDB API:如何避免请求率大的错误
- swift - 将 Swift 3 函数转换为 Swift 4
- python - 将两个 pyspark 数据帧相乘
- javascript - 如何从 React 组件调用外部函数
- vba - Excel VBA - 将特定工作簿中的所有工作表复制到活动工作簿中
- javascript - Firebase 登录 Facebook / Google - UID