JXDatePicker à l'aide de SimpleDateFormat au format jj.MM.aa à jj.MM.aaaa avec le siècle en cours
comme déjà expliqué que je veux réaliser, que lorsque l'utilisateur est en train de modifier une date dans un JXDatePicker, il peut choisir, à la météo il tape à nouveau dans le même format, qui est par défaut le dd.MM.aaaa ou tout simplement dd.MM.aa. Quand il utilise la forme courte, je veux le Sélecteur pour choisir le siècle en cours.
Exemple:
27.01.2012 edited to 27.01.10 should result in 27.01.2010
ainsi que:
27.01.2012 edited to 27.01.2010 should also result in 27.01.2010
Par défaut, le JXDatePicker handels-il de la façon suivante:
27.01.2012 edited to 27.01.10 results in 27.01.0010
Qui n'est pas vraiment la façon dont je voulais qu'il fonctionne. Après quelques recherches, j'ai trouvé la Méthode suivante dans SimpleDateFormat
/**
* Sets the 100-year period 2-digit years will be interpreted as being in
* to begin on the date the user specifies.
*
* @param startDate During parsing, two digit years will be placed in the range
* <code>startDate</code> to <code>startDate + 100 years</code>.
*/
public void set2DigitYearStart(Date startDate)
À première vue, cela sonnait exactement comme ce dont j'ai besoin. Donc je l'ai testé et malheureusement ça n'a pas fonctionné comme je l'espérais qu'il le ferait. C'est parce que je veux utiliser dd.MM.aaaa comme format d'affichage des dates, et que vous souhaitez qu'il s'affiche comme ça en edit mode. Par exemple lorsque l'utilisateur klicks sur une date comme 27.01.2012, je veux aussi qu'il soit comme ça en edit mode, trop et pas seulement à court formulaire: 27.01.12.
Mon Problème est maintenant, que set2DigitYearStart(Date) malheureusement ne fonctionne que lorsque je choisis d'utiliser le shortform en edit mode. J'ai fait un petit exemple pour montrer ce cas (SwingX Bibliothèque est nécessaire, en raison de jxdatepicker et peut être trouvé être ici).
public class DatePickerExample extends JPanel
{
static JFrame frame;
public DatePickerExample()
{
JXDatePicker picker = new JXDatePicker();
JTextField field = new JTextField( 10 );
add( field );
add( picker );
final Calendar instance = Calendar.getInstance();
instance.set( 2012, 01, 26 );
Date date = instance.getTime();
picker.setDate( date );
// SimpleDateFormat format = new SimpleDateFormat( "dd.MM.yy" );//Works, but I wonna display and edit it with dd.MM.yyyy
SimpleDateFormat format = new SimpleDateFormat( "dd.MM.yyyy" );
final Date startDate = new Date( 0 );//01.01.1970
format.set2DigitYearStart( startDate );
picker.setFormats( format );
}
public static void main( String[] args )
{
frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setBounds( 400, 400, 400, 400 );
frame.setLayout( new BorderLayout() );
frame.add( new DatePickerExample() );
frame.setVisible( true );
}
}
Si quelqu'un a déjà eu la même exigence et peut me dire comment faire ce travail? Toutes les idées sont les bienvenue. Merci beaucoup à l'avance. ymene
Haha, m'! Même si en 2012, il n'y a rien de mal avec le fait de considérer la façon dont le logiciel permet de travailler à l'avenir! 😛
OriginalL'auteur crusam | 2012-01-27
Vous devez vous connecter pour publier un commentaire.
Final (je l'espère 🙂
Résumé de la première édition:
La raison en est DatePickerFormatter: il ne permet pas de spécifier la mise en forme format (utilise simplement la première). Le moyen de sortir est une coutume DatePickerFormatter, qui le supporte (dans l'extrait, c'est codé en dur à utiliser la deuxième):
Pas entièrement sûr si nous devons soutenir la configuration du formateur dans la classe de base. Le DatePickerFormatter est un peu étrange bête, ne s'étendant pas InternalFormatter et avec le processus de recherche d'être un peu en concurrence avec un FormatterFactory...
Original
Ce n'est pas exactement le datePicker qui s'occupe de ça, c'est la mise en forme de base (D1e déjà noté). Aucun défaut format/ter/s en charge deux formats en même temps: à voir, à essayer d'atteindre votre objectif avec un JFormattedTextField 🙂
La façon dont pourrait être un FormatterFactory: il permet d'utiliser des formats différents, selon le contexte: afficher et modifier ce dernier est utilisé lorsque le champ est concentré, l'ancien, à tous les autres moments. Comme le sélecteur de l'éditeur est un JFormattedTextField, vous pouvez le configurer directement (au lieu d'utiliser le setFormats méthodes)
Modifier
se cogner la tête après la lecture de Robin récente de réponse (+1!) - enfin, embarassingly après des années et des années, je comprends ce que SwingX' DatePickerFormatter est en train de faire: c'est à l'appui d'une chaîne de recherche de formateurs (du plus long au plus court), la plus longue utilisée après avoir commis le plus court pour faciliter la saisie par les utilisateurs.
Malheureusement cela ne fonctionne pas comme intuitivement attendu. Étant donné une séquence de formats, plus long au plus court (et correctement configuré pour le siècle):
et compte tenu de l'entrée
se sent comme de passer de la première à la seconde, soit
mais n'est-ce pas. Comme l'a documenté (qui lit la documentation ... paresseux moi, toux ...) dans SimpleDateFormat
À la fin de la journée - comme DatePickerFormatter tente de soutenir cette recherche, mais n'est pas efficace, cela pourrait être considéré comme un SwingX problème, après tout 🙂
avez-vous peut-être toute simple suggestion comment parvenir à cela, ou dois-je vraiment remplacer les JFormattedTextFields pour formater ces chaînes sur mon propre? J'ai aussi remarqué que je peux ajouter plusieurs formats comme editformat. Mais malheureusement qui n'a pas aidé non plus.
comme l'a déjà indiqué dans ma réponse: c'est la base du comportement, bien au-delà du contrôle de SwingX. N'a pas vraiment à creuser, mais je pense que vous pouvez pas avoir les deux - comment le formateur de savoir lequel utiliser? Vous essayer de mettre en œuvre un module de formatage sur le dessus des deux formats .. s'il vous plaît laissez-nous savoir quand vous réussissez, peut-être une belle contribution à SwingX 🙂
C'est une idée intéressante. Depuis que je suis à court de temps, je vais aller avec le comportement par défaut de la première, mais votre idée est noté et je vous tiens au courant, dès que j'ai une solution satisfaisante 🙂
jetez un oeil à ma réponse pour que composite formateur.
OriginalL'auteur kleopatra
Je ne suis pas tout à fait conscient de JXDatePicker en particulier, mais si le béton de fonctionnalités que vous souhaitez simuler est: les Deux entrées de l'utilisateur 27.01.2010 et 27.01.10 indépendamment devrait entraîner 27.01.2010
Puis cela va fonctionner:
La chose est que le premier vous analyser entrée avec "dd.MM.yy" et revenir ensuite mise en forme avec "dd.MM.aaaa".
Espère que cette aide ou de l'aide de l'application de votre scénario.
OriginalL'auteur JMelnik
kleopatra déjà expliqué sur la façon de définir un
Format
sur le sélecteur de date. Pour ce cas d'utilisation, je voudrais appliquer une combinaison d'unCompositeFormat
etParseAllFormat
au lieu d'avoir un format distinct pour l'édition et le mode régulier pour éviter la modification de laString
lorsque vous commencez à modifier (comme vous l'avez déjà remarqué).Composite format
Le composite format, comme son nom l'indique, est un composite de mise en œuvre de la
Format
classe, mais seulement pour l'analyse. Pour la mise en forme, il utilise unFormat
. Cela permet à l'utilisateur d'entrer sa date dans de nombreuses formes, alors qu'il est mis en forme de façon constante en utilisant un format spécifique pour le format.Vous pouvez obtenir ce comportement, ainsi que par l'écriture d'un plus sophistiqué
Format
. Mais dans ce cas, il est plus facile d'utiliser la mise en forme/analyse des fonctionnalités proposées par lesSimpleDateFormat
classe du JDK.ParseAllFormat
Généralement une entrée de l'utilisateur que vous souhaitez que l'ensemble de la saisie de l'utilisateur peut être formaté/analysé afin d'éviter que l'utilisateur peut entrer une Chaîne de caractères qui est à moitié correct. Le
ParseAllFormat
est un décorateur pour uneFormat
qui jetteParseException
s lorsque seulement une partie de laString
peut être analysé.La combinaison de ces deux classes permet le code suivant
résultant dans la sortie suivante
Remarque qu'il y a un petit bonhomme pour lequel je n'ai pas trouvé une bonne solution. L'ordre dans lequel vous ajoutez
Format
instances de laCompositeFormat
est aussi de l'ordre dans lequel ils sont évalués pour l'analyse. Dans ce cas, vous devez ajouter dans l'ordre correct, car même lesnew SimpleDateFormat( "dd.MM.yyyy" )
semble accepter la chaîne d'entrée27.01.10
et peut analyser l'ensemble de laString
à unDate
objet équivalent à27.01.0010
.J'ai eu le même problème avec l'analyse de la ans ... la principale raison que j'ai ajouté la remarque à propos de l'ordre des formats dans le composite format
OriginalL'auteur Robin