2016-07-20 14 views
1

Problem: Wenn der Pfeil dateSpin angeklickt wird, ändert der Spinner Jahre anstelle von Tagen. Ich möchte es standardmäßig so machen, dass nur Tage geändert werden + machen Sie es so, dass der Benutzer seine eigene Eingabe in das Drehfeld nicht eingeben kann.JSpinner Standard ändert Jahre statt Tage

import javax.swing.*; 
import javax.swing.event.ChangeListener; 
import java.awt.*; 
import java.util.Calendar; 
import java.util.Date; 

public class Test1 extends JFrame 
{ 

public static void main(String[] args) 
{ 
    Test1 frame1 = new Test1(); 
    frame1.setVisible(true); 
} 

public Test1() 
{ 
    super("Test"); 
    setLayout(new FlowLayout()); 

    setSize(300,300); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 

    JSpinner spinner = new JSpinner(); 
    Date date = new Date(); 
    spinner.setModel(new SpinnerDateModel(date, null, null, Calendar.DAY_OF_MONTH)); 

    JSpinner.DateEditor dateEditor = new JSpinner.DateEditor(spinner, "yyyy/MM/dd"); 

    spinner.setEditor(dateEditor); 

    add(spinner); 

    } 

} 

in Oracle-Dokumentation wird dieses Problem erwähnt:

Beachten Sie jedoch, dass einige Arten von Optik und Haptik des angegebene Feld ignorieren und stattdessen das Feld ändern, die ausgewählt erscheint.

Da ich jedoch Java nicht flüssig beherrsche, verstehe ich nicht, wie ich das beheben kann.

+1

Für bessere Hilfe eher, ein [MCVE] oder [kurze, unabhängige, korrekte Beispiel] (http://www.sscce.org/). –

+0

Ich habe gerade einen MCVE gemacht in dem sowohl Windows LAF als auch (; Standard) Metal aussehen und sich anfühlt, das Jahr zuerst geändert, weil es die Nummer im Fokus war. Wenn der Pfeil durch den Tag ging, änderten die Auf-/Ab-Tasten den Tag. –

+0

So muss ich es manipulieren und das Layout ändern, sobald ich es in die CSV-Datei hochlade. Ich denke, ich könnte diesen Weg gehen, aber ich dachte nur, dass es vielleicht eine offensichtliche Lösung gibt. Vielleicht sofort auf Tage konzentrieren? –

Antwort

2

Es ist keine gute Lösung, aber Sie könnten einfach sicherstellen, dass die Caret-Position des Textfelds immer am Ende ist (die Tatsache, dass Sie möchten, dass der Spinner nicht editierbar ist, macht diese Technik vielleicht etwas erträglicher):

dateEditor.getTextField().setEditable(false); 
dateEditor.getTextField().addCaretListener(new CaretListener() { 
    @Override 
    public void caretUpdate(CaretEvent e) { 
     int pos = dateEditor.getTextField().getDocument().getLength(); 
     if (e.getDot() != pos) { 
      dateEditor.getTextField().setCaretPosition(pos); 
     } 
    } 
}); 

Dieser arbeitete für mich folgende LAFS mit: Metal, Nimbus, Motif, Windows, Windows Classic. (Das ist alles LaFs, das ich gerade testen kann)

+0

Es funktioniert! Vielen Dank. –