3

JDateChooserを使用してフォームの日付を編集しています。

短いバージョン: JDateChooser でのユーザー日付編集プログラムによるプロパティ変更を区別する必要があります。

回避策: dateSelectedという名前の保護された JDateChooser プロパティが見つかりました。これはまさに私が必要としているものです (Getter はありません)。おそらく、独自の拡張 JDateChooser クラスを作成し、このプロパティの getter を作成する必要があります。ここでの問題は、このカスタム バージョンを Netbeans パレットからドラッグできるようにしたいのですが、カスタム JDateChooser をドラッグできないことです。

詳細バージョン: まず、データベースから日付を取得し、JDateChooser の setDate() メソッドを使用して GUI で日付を設定します。ユーザーがチューザーで新しい日付を選択したときにデータベースの日付を編集したい。そのために、JDateChooser オブジェクトの PropertyChange イベントをリッスンします (「日付」の変更を探します)。データベースに新しい日付を設定した後、データを更新し (データベースからレコード全体を取得します)、データベースから日付を設定します (エラーが発生した場合は、データベースにあるものに戻されます)この時点で)。

問題は、データベースから日付を設定すると、ユーザーが日付を変更したときに同じイベントが発生し、「更新」メカニズムが JDateChooser フィールドを更新して無限ループになることです。

私の既存の(簡略化された)コード(netbeans):

private void dataStartuChooserPropertyChange(java.beans.PropertyChangeEvent evt) {
    if ("date".equals(evt.getPropertyName())) {
        JDateChooser wybieraczDat = (JDateChooser) evt.getSource();
        updateDatabaseField(wybieraczDat.getDate());
    }
}
4

3 に答える 3

0

私はこれを行うクレイジーな方法を見つけたので、ここで自分自身に返信します (これは潜在的に価値がない可能性がありますが、私のニーズには問題ありません)。時間がないので、完全に機能する例を作成しません。それでも一部1が利益を得る可能性があります。

日付がユーザーによって選択されたか、またはJDateChooserの でプログラムによって設定されたかを確認するPropertyChangeEventには、 という名前のプライベート フィールドを確認します。必要なこと (データベースの変更) を行った後、このフィールドを元に戻します。以下のサンプル(最適化されていない、醜い、私が何をしたかを示すためだけに)コード。JDateChooserdateSelectedfalsetrue

JDateChooser aDateChooserInstance = new JDateChooser();

// Listen for property changes
aDateChooserInstance.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
    public void propertyChange(java.beans.PropertyChangeEvent evt) {
        // If the 'date' property was changed...
        if ("date".equals(evt.getPropertyName())) {
            JDateChooser aDateChooser = (JDateChooser) evt.getSource();
            boolean isDateSelectedByUser = false;
            // Get the otherwise unaccessible JDateChooser's 'dateSelected' field.
            try {
                // Get the desired field using reflection
                Field dateSelectedField = JDateChooser.class.getDeclaredField("dateSelected");
                // This line makes the value accesible (can be read and/or modified)
                dateSelectedField.setAccessible(true);
                isDateSelectedByUser = dateSelectedField.getBoolean(aDateChooser);
            } catch (Exception ignoreOrNot) {
            }

            // Do some important stuff depending on wether value was changed by user
            if (isDateSelectedByUser) {
                importantStuff();
            }

            // Reset the value to false
            try {
                Field dateSelectedField = JDateChooser.class.getDeclaredField("dateSelected");
                dateSelectedField.setAccessible(true);
                isDateSelectedByUser = dateSelectedField.setBoolean(aDateChooser, false);
            } catch (Exception ignoreOrNot) {
            }
        }
    }
});
于 2012-11-07T02:46:23.533 に答える
0

私はActionListenerを使用しています

fr.getFirstDate().getCalendarButton().addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            fr.getSeconDate().setEnabled(true);
        }
    });
于 2016-03-29T17:14:38.973 に答える
0

この質問には長い間答えが出ているようですが、私のアプローチも研究に任せたいと思います。

私のアプローチは、Date chooser 内で JTextField を取得し、そのドキュメントを取得してイベントをフックし、日付が変更されて有効かどうかを確認してから、ユーザー指定のラムダ式を呼び出すことです。

ラムダのインターフェース:

public interface IDateChooserChangedEvent {
    public void run(DocumentEvent evt);
}

イベントを登録する関数。

public static void addDateChangedEvent(JDateChooser dt, IDateChooserChangedEvent evt) {
    ((JTextField)dt.getDateEditor()
            .getUiComponent())
                .getDocument()
                    .addDocumentListener(new DocumentListener() {
                        Date lastDate = dt.getDate();
                        @Override
                        public void insertUpdate(DocumentEvent e) {
                            if(dt.getDate != null && !dt.getDate().equals(lastDate)) {
                                SwingUtilities.invokeLater(()->
                                    evt.run(e));
                                lastDate = dt.getDate();
                            }
                        }
                        @Override
                        public void removeUpdate(DocumentEvent e) {
                        }
                        @Override
                        public void changedUpdate(DocumentEvent e) {
                        }
                    });

そして、イベントの Lambda スタイルの登録。

addDateChangedEvent(myDate, (evt) -> {
        System.out.println("Date changed and is now "+new SimpleDateFormat("dd/MM/yyy").format(myDate.getDate())+"!");
    });
于 2015-03-27T14:57:53.597 に答える