2012-01-12 10 views
1

私は2つの日付ピッカーコンポーネントと、関連付けられたアクションリスナを持つJComboBoxコンポーネントを持っています。私の問題はこれです:任意の日付ピッカーから日付を選択すると、関連付けられているイベントは発生しませんが、JComboBoxのイベントも発生します。驚きに加えて、JComboBoxのイベントが最初に起動されます!日付ピッカーがJComboBoxのactionPerformedを予期せずトリガーするのはなぜですか?

一方、JComboBoxコンポーネントをクリックして値を選択すると、JComboBoxイベントだけが起動され、日付ピッカーイベントは発生しません。これは問題ありません。しかし、上記のパラグラフで説明した状況の理由は何ですか?さらに、それを明確にするために

JComboBox event fired even if only date pickers are clicked

、ここでは、コンソールの出力例です。まず私は、最初の日付ピッカーをクリックして日付を選択します。

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(); 
      } 
     }); 
    } 
} 
+0

_JComboBoxのイベントは最初に起動しませんそれはそうではありません。代わりに、それはあなたのプリントアウトのシーケンスのためにのみ表示されます。ピッカーがactionEventを起動し、リスナーでコンボのアクションを起動するコンボをリスナーで変更し、メッセージを出力します。ピッカーのリスナーに戻ってもう1つのメッセージが表示されます – kleopatra

答えて

2

ActionListenerの匿名クラスからfixedRangesComboBox.setSelectedIndex(-1);を削除する必要があります。

+0

どうすればコンボボックスをリセットできますか?私のユースケースでは、コンボボックスで何かを選択し、日付ピッカーの1つから日付を選択すると、コンボボックスがリセットされます。 –

+0

@EmreSevinçはなぜあなたが驚いているのかわかりません。コンボの選択を変更すると常にactionEventが発生します。これは、プログラマチックに選択を変更するときに発砲することを意味します... – kleopatra

+0

言い換えれば、「コンボの選択を変更する」とは、コンボをクリックして項目を選択し、「コンボの選択を変更する」とは日付ピッカーのactionPerformed関数。 –

1

(最も優れた回避策)がありますJCalendarSwingXに、私はFocusですべての問題を見たことがない、Action、これら2 DatePickers

を使用することによって、メソッドまたはun_expectedイベントを実装
+1

最後のコメントが削除されました.JOPは使用されていません - 未使用のインポートによってだまされました;-) – kleopatra

関連する問題