【发布时间】:2015-08-18 22:01:35
【问题描述】:
我想编写一个简单的 Swing 应用程序。它应该根据用户输入(初始日期和天数)计算日期。 这就是我的应用程序现在的样子。
但是由于经验不足,我在应用程序中遇到了一些问题。
当中间字段
textField中的值更改时,resultDayField中的值不会更改,但只有在按下“Enter”后才会更改。我在这里看到了如何使用DocumentListener和JFormattedField跟踪更改的不同解决方案,但我的情况需要面板中所有小部件的通用侦听器以同时跟踪更改。我不明白如何混合ActionListener和DocumentListener来同时使用它们。我该怎么办?此外,如果中间字段
textField为空,则选择任何日期都会导致应用程序崩溃并出现空指针异常。但是我不明白为什么应用程序不能只写“Null”。-
一段奇怪的代码
SomeActionListener listen = new SomeActionListener(datePicker, textField, resultDateField); datePicker.addActionListener(listen); textField.addActionListener(listen);我不确定这样做是否好。
您能评论一下这些问题吗?
这是应用程序的两个源文件。
第一个(主要)是TestJDatePicker.java:
import org.jdatepicker.JDatePicker;
import org.jdatepicker.impl.JDatePanelImpl;
import org.jdatepicker.impl.JDatePickerImpl;
import org.jdatepicker.impl.UtilDateModel;
import javax.swing.*;
import java.awt.*;
import java.util.Properties;
public class TestJDatePicker extends JPanel {
JTextField textField;
JTextField resultDateField;
JDatePicker datePicker;
public TestJDatePicker() {
Properties p = new Properties();
p.put("text.today", "Today");
p.put("text.month", "Month");
p.put("text.year", "Year");
UtilDateModel model = new UtilDateModel();
JDatePanelImpl datePanel = new JDatePanelImpl(model, p);
JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, new DateLabelFormatter());
textField = new JTextField(20);
textField.setText("10");
resultDateField = new JTextField(20);
SomeActionListener listen = new SomeActionListener(datePicker, textField, resultDateField);
datePicker.addActionListener(listen);
textField.addActionListener(listen);
add(datePicker);
add(textField);
add(resultDateField);
setPreferredSize(new Dimension(850, 450));
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("DocumentEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new TestJDatePicker();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
我写的第二个文件是SomeActionListener.java:
import org.jdatepicker.impl.JDatePickerImpl;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class SomeActionListener implements ActionListener {
private JTextField resultDateField;
private JTextField textField;
private JDatePickerImpl datePicker;
//...
public SomeActionListener(JDatePickerImpl datePicker, JTextField textField, JTextField resultDateField){
this.textField=textField;
this.datePicker=datePicker;
this.resultDateField = resultDateField;
//...
}
public void actionPerformed(ActionEvent e) {
final SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
Date selectedDate = (Date) datePicker.getModel().getValue();
//System.out.println(selectedDate);
System.out.println(textField.getText());
int days = Integer.parseInt(textField.getText());
Calendar cal = Calendar.getInstance();
cal.setTime(selectedDate);
cal.add(Calendar.DATE, days);
resultDateField.setText(cal != null ? sdf.format(cal.getTime()) : null);
}
}
【问题讨论】:
-
“但我的情况需要面板中所有小部件的通用侦听器以同时跟踪更改” 这是否意味着对任何字段的任何更改都可能导致其他字段的更改?如果有,是什么关系?
-
int days = Integer.parseInt(textField.getText());将在文本字段为空时导致Exception,因为""不是有效数字,您需要先检查该字段是否有值,然后再执行任何其他操作计算。 -
中间字段上的
DocumentListener是检测实时变化的最佳选择。你也可以考虑JSpinner -
@MadProgrammer 左侧和中间字段应相互跟踪,以便在右侧字段中计算正确的日期。右侧字段不应该是可编辑的。
-
所以,据我了解,左侧和中间字段在更改时会更新右侧字段,但左侧或右侧字段都不会相互影响,对吧?
标签: java swing actionlistener jtextfield