tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Vereth
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
829
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Hi Leute,
    also die Situation ist so: Habe in einen CellEditor ein JFormattedTextField übergeben. Bei dem JFormattedTextField ist es standardmäßig so, dass bei falscher Eingabe die Zelle nicht verlassen wird. Das ist auch in Ordnung so. Nur mein Probleme besteht darin, dass trotzdem die stopCellediting()-Methode aus der Cell-Editor Klasse aufgerufen wird. Meine Frage wäre dahingehend ob ich den Aufruf unterbinden kann. Um die Situation etwas genauer zu erläutern warum ich das möchte. Der Celleditor ist für eine Zeiteingabe bestimmt dessen Format ich über die JFormattedTextField vorgebe "##:##:##". Die Cell-Editor Klasse hab ich selbst geschrieben. In der stopCellEditing()-Methode soll geprüft werden ob die Zeit gültig ist. Also nicht 99:99:99. Wenn jemand einen anderen Lösungweg, sehr gerne. Ansonsten würd ich es so machen wie oben beschrieben.

    Gruß Jan
     

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    poste doch einfach mal den relevanten Code (bitte mit den entsprechenden Code-Tags) - alles andere ist sonst Rätselraterei

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Ich habs einigermaßen hinbekommen so wie ich es wollte.Bei Enter und Focuslost bzw. beim Klicken auf einer Anderen Zelle soll jetzt immer die stopCelleditimg ausgefeührt werden. In dieser Frage ich dann ab ob Leerzeichen vorhanden sind oder eine falsche Zeit einegegeben worden ist und lasse ihn nicht aus der Zelle. Aber trotzdem hier der Code.Vlrt fällt ja meanden eine gewisse edlerer oder saubere Lösung ein.

    Code für den JFormattedTextfield
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
        MaskFormatter formatter;
        DefaultFormatterFactory defaultFormatter;
        JFormattedTextField jTextField12 = new JFormattedTextField();
        jTextField12.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "check");
        jTextField12.getActionMap().put("check", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                jTable.getColumnModel().getColumn(12).getCellEditor().stopCellEditing();
            }
        });
     
        try {
            formatter = new MaskFormatter("##:##:##");
            defaultFormatter = new DefaultFormatterFactory(formatter);
            jTextField12.setFormatterFactory(defaultFormatter);
        } catch (ParseException e) {
            e.printStackTrace();
        }
     
    public class FocusListenerTextField implements FocusListener {
        public void focusGained(FocusEvent e) {
        }
        public void focusLost(FocusEvent e) {
            jTable.getColumnModel().getColumn(12).getCellEditor().stopCellEditing();
        }
    }

    Code für die stopCellEditing()-Methode:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
        public boolean stopCellEditing() {
            JFormattedTextField jtf = (JFormattedTextField) getComponent();
            String sftf = jtf.getText().toString();
            if (sftf != "") {
                String[] stringZeiten = sftf.split(":");
                Vector<Integer> zeiten = new Vector<Integer>();
     
                for (String stringZeit : stringZeiten) {
                    if (stringZeit.contains(" ")) {
                        JOptionPane.showMessageDialog(null, "Fehlerhaftes Zeitformat eingegeben: "
                                + "\nDie Zeit muss im Format SS:MM:SS eingegeben werden", "Fehler",
                                JOptionPane.WARNING_MESSAGE);
                        return false;
                    }
                    zeiten.add(Integer.valueOf(stringZeit));
                }
     
                if (zeiten.get(0) < 0 || zeiten.get(0) > 23 || zeiten.get(1) < 0 || zeiten.get(1) > 59
                        || zeiten.get(2) < 0 || zeiten.get(2) > 59) {
                    JOptionPane.showMessageDialog(null, "Ungültige Zeit eingegeben: "
                            + "\nDie Zeit muss zwischen 00:00:00 und 23:59:59 liegen", "Fehler",
                            JOptionPane.WARNING_MESSAGE);
                    return false;
                }
            }
            System.out.println("in CellEdLP  stopCellEditing: " + sftf);
            if (STR != null && STR.equals(sftf)) {
                super.cancelCellEditing();
                return true;
            }
            STR = jtf.getText().toString();
            super.stopCellEditing(); // cellvalue uebernehmen
            return true;
        }
     

  4. #4
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Schau dir mal dieses Demo-Programm an:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    
    /*
    Title: Separating Date and Time in a JSpinner
    Description: Separating date and time in JSpinner using java swing.
    This file came from Planet-Source-Code.com...the home millions of lines of source code
    You can view comments on this code/and or vote on it 
    at: [url]http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=5512&lngWId=2[/url]
     
    The author may have retained certain copyrights to this code...please 
    observe their request and the law 
    by reviewing all copyright conditions at the above URL.
    */
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerDateModel;
    import javax.swing.JSpinner.DateEditor;
     
    /**
     * Represents the frame used to display the date and time.
     * 
     * @author ali
     */
     
    public class SplitDateTime extends JFrame {
     
        /**
         * Label used for date spinner.
         * 
         */
        private JLabel dateSpinnerLabel = null;
     
        /**
         * Label used for time spinner.
         */
        private JLabel timeSpinnerLabel = null;
     
        /**
         * Spinner component for date.
         * 
         */
        private JSpinner dateSpinner = null;
     
        /**
         * Spinner component for time.
         * 
         */
        private JSpinner timeSpinner = null;
     
        /**
         * ContentPane.
         */
        private Container container = null;
     
        /**
         * Panel that holds the dateSpinnerLabel and dateSpinner.
         * 
         */
        private JPanel dateHolder = null;
     
        /**
         * Panel that holds the timeSpinnerLabel and timeSpinner.
         * 
         */
        private JPanel timeHolder = null;
     
        /**
         * Label used for spacing.
         */
        private JLabel spacerLabel = null;
     
        /**
         * Default Constructor.
         * 
         */
        public SplitDateTime() {
            super("Separating Date and Time in JSpinner");
            initGUI();
            createGUI();
        }// end default constructor.
     
        /**
         * Initialize the UI components required for creating the GUI.
         */
        private void initGUI()
        {
            dateSpinnerLabel = new JLabel("Date");
            timeSpinnerLabel= new  JLabel("Time");
            
            dateSpinner=new JSpinner(new SpinnerDateModel());
            timeSpinner= new JSpinner(new SpinnerDateModel());
            
            dateSpinner.setEditor(new DateEditor(dateSpinner, "dd.MM.yyyy"));
            timeSpinner.setEditor(new DateEditor(timeSpinner, "HH:mm:ss"));
            
            container  = getContentPane();
            
            dateHolder= new JPanel(new BorderLayout());     
            timeHolder=new JPanel(new BorderLayout());
                    
            spacerLabel=new JLabel();
            spacerLabel.setPreferredSize(new Dimension(10,10));
        }// end method initGUI.
        
        /**
         * 
         * Creates the GUI.
         **/
        private void createGUI()
        {
            container.setLayout(new BorderLayout());
            
            dateHolder.add(dateSpinnerLabel, BorderLayout.WEST);
            dateHolder.add(dateSpinner, BorderLayout.EAST);
            
            timeHolder.add(timeSpinnerLabel,BorderLayout.WEST);
            timeHolder.add(timeSpinner,BorderLayout.EAST);
            
            container.add(dateHolder, BorderLayout.NORTH);
            container.add(spacerLabel, BorderLayout.CENTER);
            container.add(timeHolder, BorderLayout.SOUTH);
            
            setBounds(200, 200, 350, 75);
            setResizable(false);
            setVisible(true);
        }// end method createGUI.
        
        /**
         * Ímplementation of the main method.
         * 
         * @param args
         */
        public static void main(String[] args)
        {
            new SplitDateTime();
        }// end method main
    }
    Damit der Spinner auch das richtige Feld hochzählt, z.B. Minute statt Stunde, muss man natürlich das Caret (den Text-Cursor) dorthin positionieren, beispielsweise per Mausklick. Eine Eingabe per Tastatur ist aber auch möglich.
    ElJarno bedankt sich. 
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  5. #5
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    also so richtig habe ich das Problem immer noch nicht gelöst. Noch mal hier die Vorgaben. Also die Zeiteingabe geschieht über einen JFromattedTextField damit die Fromatierung schon mal passt und die Eingabe erleichtert wird. Jetzt soll aber bei der eingabe von z.b "99:99:99" ein JOptionpane oder was Anderes angezeigt werden genauso wie wenn man nur "99:9 : " eingibt. Vorher soll die Zelle auch nicht verlassen werden. Die JFormattedTexField benutze ich deswegen weil ich den CellEditor in einer Tabelle einbette. Deswegen wollte ich jetzt nicht unbedingt den Spinner verwenden. Es sei denn man kann dem Eigenschaften übergeben dass nur die Uhrzeit zwischen 00:00:00 und 23:59:59 liegen soll und bei der Eingabe von 26:00:00 nicht 02:00:00 daraus wird sonder wie gesagt das JOptionPane aufpopt und die Eingabe nicht beendet wird.
     

  6. #6
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Dann hänge doch einen ChangeListener an das SpinnerDateModel (Methode addChangeListener, geerbt von AbstractSpinnerModel). Auf diese Weise kannst du verfolgen, welche Werte wie geändert wurden, und entscheiden, was getan werden soll. Alternativ dazu kannst du natürlich auch den ChangeListener dem JSpinner direkt hinzufügen.

    PS: Ich persönlich würde das nicht tun, weil ich die vorgegebene Verhaltensweise als praktisch empfinde.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

Ähnliche Themen

  1. JFormattedTextField
    Von patrick1982l im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 29.04.10, 11:57
  2. PropertyChangeListener an JFormattedTextField
    Von nuely im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 23.10.08, 10:29
  3. JTextField bzw JFormattedTextField
    Von MScalli im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 26.05.08, 12:53
  4. Problem mit JFormattedTextField
    Von maddos im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 08.05.08, 17:44
  5. CellEditor
    Von darksmilie im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 29.08.06, 16:22

Stichworte