Java 根据用户输入计算星期几

Java 根据用户输入计算星期几,java,swing,calendar,Java,Swing,Calendar,我不知道如何让我的程序根据用户输入的月、日、年来计算一周中的哪一天。如下图所示。我不知道如何使它连接到JTextField和jcombox。我真的很感谢任何人的帮助。我知道我应该用: 日历圣诞节=新公历1998年12月25日; int dayOfWeek=xmas.getCalendar.DAY\u OF_WEEK;//6=星期五 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.Act

我不知道如何让我的程序根据用户输入的月、日、年来计算一周中的哪一天。如下图所示。我不知道如何使它连接到JTextField和jcombox。我真的很感谢任何人的帮助。我知道我应该用:

日历圣诞节=新公历1998年12月25日; int dayOfWeek=xmas.getCalendar.DAY\u OF_WEEK;//6=星期五

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JTextField;
import javax.swing.JTextArea;



public class DayOfWeek extends JFrame 
{

    private JPanel contentPane;
    private JTextField yearField;
    private JLabel dayOfW;

    /**
     * Launch the application.
     */
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    DayOfWeek frame = new DayOfWeek();
                    frame.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public DayOfWeek()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 230);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel monthL = new JLabel("Month:");
        monthL.setBounds(10, 11, 46, 14);
        contentPane.add(monthL);

        JComboBox monthBox = new JComboBox();
        monthBox.setModel(new DefaultComboBoxModel(new String[] {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}));
        monthBox.setBounds(53, 8, 109, 20);
        contentPane.add(monthBox);

        JLabel dayL = new JLabel("Day: ");
        dayL.setBounds(172, 11, 31, 14);
        contentPane.add(dayL);

        JComboBox dayBox = new JComboBox();
        dayBox.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"}));
        dayBox.setBounds(203, 8, 53, 20);
        contentPane.add(dayBox);

        JLabel yearL = new JLabel("Year: ");
        yearL.setBounds(266, 11, 37, 14);
        contentPane.add(yearL);

        yearField = new JTextField();
        yearField.setBounds(301, 8, 86, 20);
        contentPane.add(yearField);
        yearField.setColumns(10);



        JLabel dayOfW;
        dayOfW = new JLabel("The day of the week is");
        dayOfW.setBounds(10, 153, 126, 14);
        contentPane.add(dayOfW);

        JTextArea textArea = new JTextArea();
        textArea.setBounds(172, 148, 160, 19);
        contentPane.add(textArea);

        Calendar xmas = new GregorianCalendar(1998, Calendar.DECEMBER, 25);
        int dayOfWeek = xmas.get(Calendar.DAY_OF_WEEK); // 6=Friday




    yearField.addActionListener(new ActionListener() 
    {

        @Override
        public void actionPerformed(ActionEvent e)
        {

        }
    });
}
}

非常感谢您不要在swing组件上使用awt侦听器。swing附带DocumentListener,它将侦听字段文本的更改

yearField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
  calc();
}
public void removeUpdate(DocumentEvent e) {
  calc();
}
public void insertUpdate(DocumentEvent e) {
  calc();
}

public void calc() {
   //get values from fields
   //pass them to gregorian calendar constructor
   //get day of week from calendar
   //print day to label
}
});

不要在swing组件上使用awt侦听器。swing附带DocumentListener,它将侦听字段文本的更改

yearField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
  calc();
}
public void removeUpdate(DocumentEvent e) {
  calc();
}
public void insertUpdate(DocumentEvent e) {
  calc();
}

public void calc() {
   //get values from fields
   //pass them to gregorian calendar constructor
   //get day of week from calendar
   //print day to label
}
});
试试这个:

yearField.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {

        //check the value of the other input fields
        //do the calculations

        textArea.setText("the result here");    
    }

});
试试这个:

yearField.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {

        //check the value of the other input fields
        //do the calculations

        textArea.setText("the result here");    
    }

});

你有很多选择

你可以 在每个字段上使用FocusListener,当调用focusLost时,验证每个字段的状态,以确定是否有足够的信息来执行所需的计算…但这并不考虑如果用户只在最后一个字段上按Enter键可能发生的情况

你可以 在每个字段上使用ActionListener来检测用户何时按Enter键或单个字段何时被操作,并验证每个字段的状态,以确定您是否有足够的信息来执行所需的计算,但这并不考虑用户未在字段上按Enter键的情况

你可以 同时使用FocusListener和ActionListener,它们只调用一个方法来验证每个字段的状态,以确定您是否有足够的信息来执行所需的计算

你可以 有一个用户需要按下以执行计算的按钮。激活时,它将验证每个字段的状态,以确定您是否有足够的信息来执行所需的计算

看看:

您甚至可以使用InputVerifier,有关更多详细信息,请参阅

说到这里,你们的主要问题是一个参考问题


所有字段都在本地向构造函数声明。虽然您可以将它们声明为final,并且可以从ActionListener的内部类中访问它们,但我个人会将它们声明为实例变量,以便您可以从类本身的任何位置访问它们。这为您提供了更大的机会来实现所需的逻辑。

您有许多选择

你可以 在每个字段上使用FocusListener,当调用focusLost时,验证每个字段的状态,以确定是否有足够的信息来执行所需的计算…但这并不考虑如果用户只在最后一个字段上按Enter键可能发生的情况

你可以 在每个字段上使用ActionListener来检测用户何时按Enter键或单个字段何时被操作,并验证每个字段的状态,以确定您是否有足够的信息来执行所需的计算,但这并不考虑用户未在字段上按Enter键的情况

你可以 同时使用FocusListener和ActionListener,它们只调用一个方法来验证每个字段的状态,以确定您是否有足够的信息来执行所需的计算

你可以 有一个用户需要按下以执行计算的按钮。激活时,它将验证每个字段的状态,以确定您是否有足够的信息来执行所需的计算

看看:

您甚至可以使用InputVerifier,有关更多详细信息,请参阅

说到这里,你们的主要问题是一个参考问题


所有字段都在本地向构造函数声明。虽然您可以将它们声明为final,并且可以从ActionListener的内部类中访问它们,但我个人会将它们声明为实例变量,以便您可以从类本身的任何位置访问它们。这为您提供了更大的机会来实现所需的逻辑。

为什么不创建一个按钮?然后,您为该按钮设置一个操作,并根据输入字段检查日期。否则,我想您必须在三个字段中的更改事件上执行此操作。只需从输入中获取值,将其传递给公历构造函数,从一周中的日历日获取并打印到标签。我无法为其创建按钮,只能通过按yearField的enter键进行计算。所以我真的不知道如何链接它。@user2268587好的,这是你应该在最初的帖子中说的。请检查我的答案。请修复问题标题。为什么不创建一个按钮?然后,您为该按钮设置一个操作,并根据输入字段检查日期。否则,您必须在中的更改事件中执行此操作
我猜这三个字段。只需从输入中获取值,将其传递给公历构造函数,从一周的日历日获取并打印到标签。我无法为其创建按钮,只能通过按yearField的enter键来计算。所以我真的不知道如何链接它。@user2268587好的,这是你应该在最初的帖子中说的。请检查我的答案。请确定问题的标题。不,永远不会,纳塔。决不应将KeyListener添加到文本组件。在您介绍的用例中,这就是ActionListener的用途。@谢谢,我不知道。刚刚意识到当你按下回车键时ActionListener被触发,焦点在字段中,理论上和我做的是一样的。编辑了我的答案。不,从来没有,纳塔。决不应将KeyListener添加到文本组件。在您介绍的用例中,这就是ActionListener的用途。@谢谢,我不知道。刚刚意识到当你按下回车键时ActionListener被触发,焦点在字段中,理论上和我做的是一样的。编辑了我的答案。不要在swing组件上使用awt侦听器-为什么?API直接支持它。不要在swing组件上使用awt侦听器-为什么?它由API直接支持