gpt4 book ai didi

java - JDateChooser focusListener

转载 作者:行者123 更新时间:2023-12-01 12:47:53 26 4
gpt4 key购买 nike

我正在尝试将 focusListener 添加到 JDateChooser,以便当用户选择 dateOfBirth 时,当焦点丢失时,它会在文本字段上显示年龄。但它不起作用这是我尝试过的方法,

导入java.awt.BorderLayout;

public class agecalc extends JFrame {
private JTextField age;
private JDateChooser dOB;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
agecalc frame = new agecalc();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public agecalc() {

JPanel panel = new JPanel();
GroupLayout groupLayout = new GroupLayout(getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addComponent(panel, GroupLayout.PREFERRED_SIZE, 290, GroupLayout.PREFERRED_SIZE)
.addContainerGap(134, Short.MAX_VALUE))
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addGap(20)
.addComponent(panel, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE)
.addContainerGap(47, Short.MAX_VALUE))
);
panel.setLayout(null);

dOB = new JDateChooser();
dOB.setBounds(97, 52, 95, 20);
panel.add(dOB);

age = new JTextField();
age.setBounds(97, 83, 86, 20);
panel.add(age);
age.setColumns(10);
getContentPane().setLayout(groupLayout);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);

AGECalc ageCalc=new AGECalc();

dOB.addFocusListener(ageCalc);
}
private class AGECalc implements FocusListener{

@Override
public void focusGained(FocusEvent e) {

}

@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
Calendar fromDate;
Calendar toDate;
Date dateOfBirth= dOB.getDate();
Date now = new Date();
fromDate=Calendar.getInstance();
toDate=Calendar.getInstance();

fromDate.setTime(dateOfBirth);
toDate.setTime(now);
int ageYear = toDate.get(Calendar.YEAR) - (fromDate.get(Calendar.YEAR) );
age.setText(Integer.toString(ageYear));
System.out.println(ageYear);



}
}






public JTextField getAge() {
return age;
}

public void setAge(JTextField age) {
this.age = age;
}

public JDateChooser getdOB() {
return dOB;
}

public void setdOB(JDateChooser dOB) {
this.dOB = dOB;
}
}

最佳答案

I'm trying to add a focusListener to JDateChooser, so that when the user chooses the dateOfBirth it displays age on the textfield when the focus is lost.

相反,我建议您实现 PropertyChangeListener并将其附加到日期选择器。这样,每次用户通过选择日期或手动输入新日期更新所选值时,无论日期选择器是否失去焦点,文本字段都会更新。

例如:

final JTextField ageTextField = new JTextField(20);
ageTextField.setEditable(false);

JDateChooser dateChooser = new JDateChooser(new Date());
dateChooser.addPropertyChangeListener("date", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
Calendar dateofBirth = Calendar.getInstance();
dateofBirth.setTime((Date)evt.getNewValue());

Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - dateofBirth.get(Calendar.YEAR);

if(today.get(Calendar.MONTH) < dateofBirth.get(Calendar.MONTH) ||
(today.get(Calendar.MONTH) == dateofBirth.get(Calendar.MONTH) && today.get(Calendar.DAY_OF_MONTH) < dateofBirth.get(Calendar.DAY_OF_MONTH))) {
age--;
}

ageTextField.setText(String.valueOf(age));
}
});
<小时/>

请参阅此问题答案中的另一个示例:

<小时/>

离题

关于此行(以及其他类似行):

dOB.setBounds(97, 52, 95, 20);

在使用 Swing 时,强烈建议不要使用 setBounds()setLocation()setSize() 等方法,因为这些方法导致组件的精确位置。是Layout Managers负责处理组件的尺寸和定位。这些都是强调这一点的有趣主题:

关于java - JDateChooser focusListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24509189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com