08. juli 2005 - 17:52Der 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?
public class DateChecker { public static void main (String[] args) { String date = "08-07-2005"; SimpleDateFormat format = new SimpleDateFormat ("dd-MM-yyyy");
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");
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);
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.
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.
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.
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.
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.
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?
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.)
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);
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.
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.
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?
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?
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.
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.
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 :-)
Synes godt om
Ny brugerNybegynder
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.