私は2つの日付ピッカーコンポーネントと、関連付けられたアクションリスナを持つJComboBoxコンポーネントを持っています。私の問題はこれです:任意の日付ピッカーから日付を選択すると、関連付けられているイベントは発生しませんが、JComboBoxのイベントも発生します。驚きに加えて、JComboBoxのイベントが最初に起動されます!日付ピッカーがJComboBoxのactionPerformedを予期せずトリガーするのはなぜですか?
一方、JComboBoxコンポーネントをクリックして値を選択すると、JComboBoxイベントだけが起動され、日付ピッカーイベントは発生しません。これは問題ありません。しかし、上記のパラグラフで説明した状況の理由は何ですか?さらに、それを明確にするために
、ここでは、コンソールの出力例です。まず私は、最初の日付ピッカーをクリックして日付を選択します。
index: -1 null
Combo Box is involved. Surprised?
This is only fired when datePicker1 is involved.
(はい、私は驚いた!)そして、私は2番目の日付ピッカーをクリックして日付を選択します。
index: -1 null
Combo Box is involved. Surprised?
This is only fired when datePicker2 is involved.
( !はい、私は再び驚いている)そして最後に、私はコンボボックスをクリックして項目を選択します。
index: 1 Last 6 months
Combo Box is involved. Surprised?
いいえ、私は上記の出力を見て驚いていません。
なぜこの奇妙な状況が起こるかについてのアイデアはありますか?
完全なソースコード:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import net.sourceforge.jdatepicker.JDateComponentFactory;
import net.sourceforge.jdatepicker.impl.JDatePickerImpl;
import net.sourceforge.jdatepicker.impl.UtilCalendarModel;
import org.jdesktop.swingx.JXDatePicker;
public class DatePickerDemo {
private static boolean isDateRangeConsistent(UtilCalendarModel m1, UtilCalendarModel m2) {
return m1.getValue().compareTo(m2.getValue()) <= 0 ? true : false;
}
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("DatePickerDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel label1 = new JLabel();
label1.setText("Choose Range (Start - End): ");
String[] fixedRanges = {"Last 3 months", "Last 6 months", "Last 12 months"};
final JComboBox<String> fixedRangesComboBox = new JComboBox<String>(fixedRanges);
fixedRangesComboBox.setSelectedIndex(-1);
final JDatePickerImpl datePicker1 = (JDatePickerImpl) JDateComponentFactory.createJDatePicker();
datePicker1.getModel().setSelected(true);
final JDatePickerImpl datePicker2 = (JDatePickerImpl) JDateComponentFactory.createJDatePicker();
datePicker2.getModel().setSelected(true);
datePicker1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Start date cannot be after end date!
if (! isDateRangeConsistent((UtilCalendarModel) datePicker1.getModel(),
(UtilCalendarModel) datePicker2.getModel())) {
((UtilCalendarModel) datePicker1.getModel())
.setValue(((UtilCalendarModel) datePicker2.getModel()).getValue());
}
//if the date range is changed by date picker, the fixed combo box becomes irrelevant
fixedRangesComboBox.setSelectedIndex(-1);
int rangeDaysStart = datePicker1.getModel().getDay();
int rangeMonthsStart = 1 + datePicker1.getModel().getMonth();
int rangeYearsStart = datePicker1.getModel().getYear();
label1.setText("Choose Range (Start - End): " + rangeDaysStart
+ "/" + rangeMonthsStart + "/" + rangeYearsStart);
System.out.println("This is only fired when datePicker1 is involved.");
}
});
datePicker2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// End date cannot be before start date!
if (! isDateRangeConsistent((UtilCalendarModel) datePicker1.getModel(),
(UtilCalendarModel) datePicker2.getModel())) {
((UtilCalendarModel) datePicker2.getModel())
.setValue(((UtilCalendarModel) datePicker1.getModel()).getValue());
}
//if the date range is changed by date picker, the fixed combo box becomes irrelevant
fixedRangesComboBox.setSelectedIndex(-1);
int rangeDaysStart = datePicker2.getModel().getDay();
int rangeMonthsStart = 1 + datePicker2.getModel().getMonth();
int rangeYearsStart = datePicker2.getModel().getYear();
label1.setText("Choose Range (Start - End): " + rangeDaysStart
+ "/" + rangeMonthsStart + "/" + rangeYearsStart);
System.out.println("This is only fired when datePicker2 is involved.");
}
});
fixedRangesComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("index: " + fixedRangesComboBox.getSelectedIndex() + " "
+ fixedRangesComboBox.getSelectedItem());
System.out.println("Combo Box is involved. Surprised?");
}
});
frame.getContentPane().add(label1, BorderLayout.NORTH);
frame.getContentPane().add(datePicker1, BorderLayout.CENTER);
frame.getContentPane().add(datePicker2, BorderLayout.EAST);
frame.getContentPane().add(fixedRangesComboBox, BorderLayout.PAGE_END);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
_JComboBoxのイベントは最初に起動しませんそれはそうではありません。代わりに、それはあなたのプリントアウトのシーケンスのためにのみ表示されます。ピッカーがactionEventを起動し、リスナーでコンボのアクションを起動するコンボをリスナーで変更し、メッセージを出力します。ピッカーのリスナーに戻ってもう1つのメッセージが表示されます – kleopatra