【问题标题】:JDateChooser focusListenerJDateChooser 焦点监听器
【发布时间】:2014-08-21 22:47:52
【问题描述】:

我正在尝试向 JDateChooser 添加一个 focusListener,以便当用户选择 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;
    }
}

【问题讨论】:

    标签: java swing jdatechooser focuslistener


    【解决方案1】:

    焦点侦听器未添加到JDateChooser

    【讨论】:

    • 对不起,是我的错。我已将焦点侦听器添加到日期选择器。我在这里粘贴时错过了。还是不行。
    • 检查focusLost()是否被调用。
    【解决方案2】:

    我正在尝试向 JDateChooser 添加一个 focusListener,这样当 用户选择 dateOfBirth 它在文本字段上显示年龄时 失去焦点。

    我建议您实现 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 负责处理组件的大小和定位。这些是强调这一点的有趣话题:

    【讨论】:

    • 非常感谢。它现在正在工作。也感谢您的布局经理建议
    猜你喜欢
    • 2018-05-03
    • 2012-08-27
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多