Avatar billede jsl Nybegynder
08. juli 2005 - 17:52 Der er 31 kommentarer og
2 løsninger

Validering af dato input?

Jeg har en jdbTextField, hvori dato skal indtastes efter formattet dd-mm-yy. Jeg tænker at, Java indeholde en metode til at tjekke om den indtastede dato opfylder det, men hvad hedder den? Hvis ikke, må jeg jo nok lave en parser. I textFielden må der også gerne stå __-__-__, så brugeren blot skal skrive datoen, der hvor '_' er. Hvordan går man det?
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 17:57 #1
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 17:59 #2
Lille hurtigt eksempel:

import java.text.*;
import java.util.*;

public class DateChecker
{
    public static void main (String[] args)
    {
        String date = "08-07-2005";
        SimpleDateFormat format = new SimpleDateFormat ("dd-MM-yyyy");
       
        try
        {
            System.out.println (format.parse(date));
        }
        catch (Exception ex)
        {
            ex.toString();
        }
    }
}
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 18:02 #3
Mht. til dit tekstfelt, kan jeg ikke umiddelbart se andre muligheder end at du laver 3 JTextFields og placerer dem efter hinanden.
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 18:12 #4
Og et lille eksempel på hvordan du kan løse dit textfield problem:

import java.text.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class DateChecker extends JFrame
{
    private JButton check = new JButton ("Tjek dato");
    private DatePanel datePanel = new DatePanel();
    private SimpleDateFormat format = new SimpleDateFormat ("dd-MM-yy");
   
    public DateChecker ()
    {
        setSize (200, 100);
       
        this.getContentPane().add(datePanel, BorderLayout.NORTH);
        this.getContentPane().add(check, BorderLayout.SOUTH);
       
        check.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                checkDate();
            }
        });   
    }
   
    private void checkDate()
    {
        String date = datePanel.getDateString();
       
        try
        {
            Date d = format.parse(date);
            JOptionPane.showMessageDialog(this, "Datoen: " + date  + " er gyldig");
        }
        catch (Exception ex)
        {
            JOptionPane.showMessageDialog(this, "Datoen: " + date  + " er ikke gyldig");
        }
    }
   
    private class DatePanel extends JPanel
    {
        private JTextField day, month, year;
        private JLabel separator1 = new JLabel("-");
        private JLabel separator2 = new JLabel("-");
       
        public DatePanel()
        {
            day = new JTextField(2);
            month = new JTextField(2);
            year = new JTextField (2);
           
            this.add(day);
            this.add(separator1);
            this.add(month);
            this.add(separator2);
            this.add(year);
        }
       
        public String getDateString()
        {
            return day.getText() + "-" + month.getText() + "-" + year.getText();
        }
    }
   
    public static void main (String[] args)
    {
        new DateChecker ().setVisible(true);
    }
}
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 18:15 #5
Hov. Mangler lige en::

format.setLenient(false);

i constructoren.
Avatar billede jsl Nybegynder
08. juli 2005 - 21:20 #6
Tak for det. Det er helt fantastisk. Nu når datoen i databasen står som dd-mm-yy, hvordan separerer jeg så dd, mm og yy fra hinanden, således at de kan vises i mine jdbTextFields? Jeg kan selvfølgelig lave én kolonne til hver af dem, men det virker også ret underligt. Der må være en metode i Java, der kan separerer dem.
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 21:23 #7
Brug split funktionen på String.
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 21:24 #8
String[] splitDat = date.split("-");
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 21:25 #9
Hvis din data-streng ser ud som følgende:

String date = "08-07-05";

Vil du få et array med tre elementer i.
Avatar billede mikkelbm Nybegynder
08. juli 2005 - 21:27 #10
Men det pæneste vil nok være at gemme det i databasen som en Date og så hive det ud i Java som en java.sql.Date. Og så derefter formatere den ud til en String.
Avatar billede jsl Nybegynder
09. juli 2005 - 16:24 #11
Det er nu implemteret og det hele programmet fungere nu næsten efter hensigten. Da alt validering og gemning af data sker når focus enten er gained eller removed, har jeg nu et problem med dialogboksen, om at datoen er invalid, vises i en uendelighed. Jeg tænker at dette problem kan løses ved at disable focuslisteneren indtil datoen er skrevet korrekt, eller et eller andet med en variabel, der sættes når boksen vises. Hvad har du af (bedre) forslag, og kan du hjælpe mig videre? Det er rigtig godt med de kodeeksempler du giver.
Avatar billede mikkelbm Nybegynder
10. juli 2005 - 16:12 #12
Godt spørgsmål :)

Den måde jeg umiddelbart ville løse det på, var nok lidt det du selv er inde på.
Jeg ville smide en KeyListener på de dato teksbokse, og så have en boolean der blev sat til true hver gang der blev smidt en keyPressed og så igen false når der blev smidt en keyReleased. Denne boolean tjekker du så på i din focuslistener.
Avatar billede mikkelbm Nybegynder
10. juli 2005 - 16:14 #13
Men spørgsmålet er så bare om din focuslistener reagerer før din keylistener. For hvis det er tilfældet, så ved jeg ikke lige hvordan det skal løses. Medmindre du laver en decideret "Gem" knap.
Avatar billede jsl Nybegynder
10. juli 2005 - 18:02 #14
Med en Gem knap kan jeg let lave det. Jeg går måske også over til det, hvis ikke det andet lykkes.
Avatar billede jsl Nybegynder
11. juli 2005 - 16:36 #15
Nu har jeg lavet en decideret Gem-knap, som gør det hele væsentligt næmmere. Jeg har dog stadig ét spg. vedr. datometoden. Når jeg markere en ny post/række i min Table, skal den tilhørende dato vises i textfielden. Jeg har prøvet med en focuslistener på tabellen, men den virker kun på hele tabellen og ikke på rækkeniveau. Er der ikke listener, der aktiveres, hver gang en ny række i tabellen vælges?
Avatar billede mikkelbm Nybegynder
11. juli 2005 - 17:42 #16
Jeg tror bare jeg vil smide en MouseListener på:

table.addMouseListener(new MouseAdapter()
{
    public void mousePressed (MouseEvent e)
    {
        System.out.println ("Række nr: " + table.getSelectedRow() + " er valgt");
    }
});
Avatar billede jsl Nybegynder
11. juli 2005 - 19:31 #17
Ja, det kan være, og en keylistener, sådan at datoen også vises, hvis brugeren skifter med piltasterne.
Avatar billede mikkelbm Nybegynder
11. juli 2005 - 19:34 #18
Det var en mulighed, ja.
Avatar billede mikkelbm Nybegynder
12. juli 2005 - 12:13 #19
Fået det til at virke?
Avatar billede jsl Nybegynder
12. juli 2005 - 22:56 #20
Ja, det virker helt perfekt. Til at overvåge piltasterne og tab, har jeg lavet flg. kode:
    public void keyReleased(java.awt.event.KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_TAB) {
            readDate();
        }
    }

Ang. den gem knap vi snakkede om, vil jeg have det sådan at når et item er ændret i comboboxen sættes enables gem knappen. Jeg kan godt finde ud af at enable knappen, men problemet er at jeg ikke kan få itemChanged metoden til at virke. Den kaldes for det første to gange samt når jeg åbner programmet. Hvad gør jeg her? (Jeg burde jo nok have oprettet et nyt spg.)
Avatar billede mikkelbm Nybegynder
12. juli 2005 - 23:07 #21
Nu ved jeg ikke hvilken listener du har tilknyttet din combobox, men jeg ville vælge en ActionListener:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TestCombo extends JFrame
{
    private DefaultComboBoxModel model = new DefaultComboBoxModel();
    private JComboBox combo = new JComboBox(model);
   
    public TestCombo()
    {
        setSize (300, 300);
       
        for (int i = 0; i<10; i++)
            model.addElement("Hej: " + i);
           
        this.getContentPane().add(combo, BorderLayout.NORTH);
       
        combo.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                System.out.println (combo.getSelectedItem());
            }
        });
    }
   
    public static void main (String[] args)
    {
        new TestCombo().setVisible(true);
    }
}
Avatar billede jsl Nybegynder
13. juli 2005 - 07:26 #22
Den har jeg også prøvet, men den afvikles også når programmet åbner.
Avatar billede mikkelbm Nybegynder
13. juli 2005 - 07:54 #23
Har du prøvet mit lille testprogram? For der bliver der ikke fyret noget ved programopstart...

Du beder den jo om at lytte på ændringer, så hvis du først fylder data i efter du har tilmeldt dig din listener, vil den listener jo blive notified idet der sker ændringer.
Avatar billede jsl Nybegynder
13. juli 2005 - 08:56 #24
Først i eftermiddag kan jeg prøve, men da det er en jdbComboBox, der er tilknyttet et dataset (jeg bruger jBuilder), sker der vel også noget allerede fra starten idet posterne fra db'en bliver loadet og forbundet til jdbComboBox'en. Jeg ved ikke helt om der er noget herom.
Avatar billede jsl Nybegynder
13. juli 2005 - 16:57 #25
Nu har jeg delvist løst problemet. Jeg fandt denne kode på nettet:

    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() != ItemEvent.SELECTED) {
            jButton8.setEnabled(true); //gem-knappen
        }
    }

Den virker på samme måde som actionPerformed(ActionEvent e). Begge afvikles idet programmet åbnes, og det skyldes, at alle items er addet til jdbComboboxen, og vha. databasen afgøres hvilke item, der skal vælges fra start. Fra programstart er det det øverste item valgt, og hvis ikke det svarer til det item, der står skrevet i databasen, ændres dette i jdbComboboxen. Det svarer til, at brugeren vælger et nyt item i jdbComboboxen. Lidt kringlet, men Forstår du?
Jeg tænker, at en løsning måtte være at sige, at mouseClicked(MouseEvent e) også skal være afviklet før gem-knappen enables. Jeg vil derfor gerne kunne anvende en C ligende global variabel, der sættes når mouseClicked(MouseEvent e) er afviklet.
Har du et forslag, og hvordan jeg giver jeg dig flere point end 30?
Avatar billede jsl Nybegynder
13. juli 2005 - 18:09 #26
Ok, så fandt jeg ud af det. Her er koden:

    public void mouseClicked(MouseEvent e) {
        jdbComboBox1.addItemListener(this);
        jdbComboBox2.addItemListener(this);
        jdbComboBox3.addItemListener(this);
        jdbComboBox4.addItemListener(this);

        if (e.getSource() == jdbTable2) {
            readDate();
        }
    }
Avatar billede mikkelbm Nybegynder
13. juli 2005 - 19:20 #27
Jeg forstår ikke helt din kommentar/spørgsmål 13/07-2005 16:57:48 - og jeg forstår heller ikke helt din løsning. For hver gang der bliver trykke på musen, så add'er du en ny listener til hver af dine comboboxe. Det kan da ikke være det du vil?
Avatar billede jsl Nybegynder
14. juli 2005 - 07:37 #28
Ja, det er måske rigtig nok.
Jeg har en jdbComboBox, hvor et antal elementer er tilføjet med addElement. Denne ComboBox er forbundet til en database, således at det rigtige element ift. posten vises. Når programmet starter afgøres, vha. databasen, hvilket element, der skal vises. Hvis ikke ComboBox var forbundet til databasen, vil det øverste element i ComboBox'en blive valgt fra starten. Fordi det nødvendigvis ikke er det øverste element, der skal står skrevet i databasen, må der vælges et nyt element i ComboBoxen. Dette foregår ved programstart, og generer et actionPerformed.
Avatar billede mikkelbm Nybegynder
14. juli 2005 - 10:09 #29
Jeg kender ikke til alle JBuilders komponenter og hvordan de virker - derfor kan jeg ikke helt sætte mig ind i dit problem - beklager.
Avatar billede jsl Nybegynder
14. juli 2005 - 10:18 #30
Ok, så lukker jeg spørgsmålet. Jeg ved godt, at det er noget slam, men for ikke at have hundrede af listener til at være aktive i programmet, kan jeg måske bare fjerne den oprettede, når posten er gemt. Det prøver jeg, og så kan det være, at engang når jeg kender mere til jBuilder, at jeg kan lave det mere rigtigt. Tak for hjælpen.
Jeg er nu ved at finpudse programmet, og gøre det så let for brugeren som muligt. Hertil har jeg et par spørgsmål til jdbTable, men nu ser jeg først lige om der er hjælp at finde på Google.
Avatar billede mikkelbm Nybegynder
14. juli 2005 - 10:55 #31
Måske du kan finde noget inspiration på Borlands hjemmeside:

http://qc.borland.com/wc/qcmain.aspx?da=1932
Avatar billede mikkelbm Nybegynder
14. juli 2005 - 10:56 #32
Avatar billede jsl Nybegynder
15. juli 2005 - 08:43 #33
Jeg fik ét af spg. besvaret, men mangler stadig det her: http://www.eksperten.dk/spm/632654. Hvis du er hurtig, så kan du tjene yderligere 30 point :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester