tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
465
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    skipjip skipjip ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    3
    Hallo,

    ich schreibe gerade ein AdminTool das Daten aus einer Datenbank holt bisher funktioniert alles wunderbar. Nun gib ich die Einträge der DB in einer JLIST aus wenn ich einen Namen auswähl soll z.B. der Vorname in einem JTextField erscheint damit man die Einträge editieren und speichern kann. Hier mal der CODE.
    Hoffe ihr könnt mir helfen das ich den Eintrag in dem JTextField ausgeben kann


    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
    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
    
     
    import javax.swing.*;
    import java.sql.*;
    import java.awt.*;
    import java.util.*;
    import javax.swing.event.*;
     
    public class AdminTool {
     
        private Connection connection;
        private Statement statement;
        private ResultSet rs;
        private JList userList;
        private ArrayList<String> arrayList;
        private JLabel label;
        private DefaultListModel dlm;
        private JTextField firstnameText, lastname, street, city, plz, mail_adress;
     
        public AdminTool() {
            try {
                Class.forName("org.sqlite.JDBC");
            } catch (Exception e) {
                System.err.println("Unable to find and load driver");
                System.exit(1);
            }
        }
     
        public void loadAccount() {
            arrayList = new ArrayList<String>();
            try {
                rs = statement.executeQuery("SELECT * FROM users;");
                while (rs.next()) {
                    arrayList.add(rs.getString("firstname") + " " + rs.getString("lastname"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
     
        public void buildGUI() {
            JFrame frame = new JFrame("");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel wPanel = new JPanel();
            JPanel cPanel = new JPanel();
     
            loadAccount();
     
            dlm = new DefaultListModel();
            userList = new JList(dlm);
            for (int i = 0; i < arrayList.size(); i++) {
                dlm.addElement(arrayList.get(i));
            }
     
            JScrollPane scroller = new JScrollPane(userList);
            scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
     
            userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            userList.addListSelectionListener(new SharedListSelectionHandler());
     
            firstnameText = new JTextField(15);
     
            userList.setVisibleRowCount(18);
            wPanel.add(scroller);
            cPanel.add(firstnameText);
            frame.getContentPane().add(BorderLayout.WEST, wPanel);
            frame.getContentPane().add(BorderLayout.CENTER, cPanel);
            frame.setSize(600, 600);
            frame.setVisible(true);
        }
     
        class SharedListSelectionHandler implements ListSelectionListener {
            public void valueChanged(ListSelectionEvent lse) {
                if (!lse.getValueIsAdjusting()) {                           
                    try {
                        while (rs.next()) {
                          firstnameText.setText(rs.getString("firstname"));
                        }
                    } catch (SQLException ex) {
                       ex.printStackTrace();
                   }
                }
            }
        }
     
        public void connectToDB() {
            try {
                connection = DriverManager.getConnection("jdbc:sqlite:/home/sklaiber/workspace/AdminTool/de/mybrief/AdminTool/mybrief_devel.db");
                statement = connection.createStatement();
     
            } catch (SQLException connectException) {
                System.out.println(connectException.getMessage());
                System.out.println(connectException.getSQLState());
                System.out.println(connectException.getErrorCode());
                System.exit(1);
            }
        }
     
        public static void main(String[] args) {
            AdminTool tool = new AdminTool();
            tool.connectToDB();
            tool.buildGUI();
        }
    }

    Danke im Voraus

    MFG Skipjip
     

  2. #2
    vNeumann vNeumann ist offline Mitglied
    Registriert seit
    Feb 2009
    Ort
    München (Bayern)
    Beiträge
    23
    Hallo!
    Ich würde die Sache mal folgendermaßen angehen.
    Als allererstes brauchst du einen Primärschlüssel (id) in deiner Datenbank, aber das wirst du sicher haben.
    Dann solltest du den Primärschlüssel auch einlesen. Ich habe das z.B. bei mir so bewerkstelligt, dass ich einen zweiten Array angelegt habe. In den einen schreibst du, so wie du es ja machst den Namen. In den anderen, am besten an der gleichen Stelle die id.

    Dann machst du eine Liste mit den Namen. Auf diese Liste legst du entweder eine Action, die ausgeführt wird, wenn du einen Namen auswählst, oder du machst einen Button, der eine Aktion ausführt, und das gerade gewählte in die TextFields ladet.
    (du kannst hier den Vorteil ausnutzen, dass du der Array 0-relativ ist (fängt bei 0 an) und die Liste auch. So weißt du dann auch, welche id du verwendest (Bsp: der vierte Namen in der Liste wird ausgewählt, das ist genau der vierte Eintrag in dem id-Array.

    Und jetzt ein wichtiger Trick: Damit du weißt, was gerade editiert wird (also in dem TextField steht), machst du einfach noch ein zweites id-Textfield dazu (kann ja auch invisible sein) und da schreibst gleich auch die id rein. Wenn du dann fertig bist mit dem Editieren, kannst einfach auf einen weiteren Button klicken "Speichern". Der führt dann die Aktionen aus:
    - aktuelle id vom id-Textfield lesen
    - Daten in die Datenbank schreiben (vom Namens-Textfield) also quasi: UPDATE tabellenname SET name=name ... WHERE id = id!
    id und name kommen vom Textfield!

    Viel Erfolg
    vNeumann
     

  3. #3
    skipjip skipjip ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    3
    ok hab eine neue ArrayList in der ich die ID speichere, aber ich weiß nicht genau was ich dann in den ListSelectionListener schreiben soll? Damit er mir den ausgewählten Eintrag von der JList in dem TextField ausgibt!
     

  4. #4
    vNeumann vNeumann ist offline Mitglied
    Registriert seit
    Feb 2009
    Ort
    München (Bayern)
    Beiträge
    23
    du kannst in dem listener einfach so etwas schreiben wie:

    idTextfield.setText(idArray.get(jList.getSelectedIndex()));
    dann schreibst du in das Textfield die id rein. die bekommst du über die jList.

    So irgendwie müsste das gehen. Ich hab das bei einer comboBox gemacht. Hoffe mal, dass es bei der jList ähnlich funktioniert
     
    Bildung kommt von Bildschirm und nicht von Buch, sonst hieße es ja Buchung.

  5. #5
    skipjip skipjip ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    3
    danke soweit funktoniert das jetzt hab ich noch ne andere frage und zwar will ich den Vornamen und Nachnamen jeweils in einem eigenen Feld ausgeben! Speicher jetzt aber beide Einträge in einer ArrayList kann ich das irgenwie machen? Oder muss ich für den Nachnamen eine eigene ArrayList anlegen?
     

  6. #6
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Da Vorname und Nachname zusammen gehören, legst du dir am besten eine eigene Klasse an, die diese beiden Daten aufnehmen kann und packst dann ein Objekt der Klasse mit den Daten in die Liste.
     

  7. #7
    vNeumann vNeumann ist offline Mitglied
    Registriert seit
    Feb 2009
    Ort
    München (Bayern)
    Beiträge
    23
    klar, die Variante von zeja mit der Klasse wäre sicherlich die schönere Lösung. Jedoch würde ich es - einfach wirklich in noch einen Array speichern. Würde nicht extra noch ne Klasse anlegen.
     
    Bildung kommt von Bildschirm und nicht von Buch, sonst hieße es ja Buchung.

  8. #8
    normaler_spinner normaler_spinner ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    117
    @vNeumann:
    Ist das Beratungsresistenz oder kannst du das irgendwie begründen weshalb du dein Array nimmst?
     

  9. #9
    vNeumann vNeumann ist offline Mitglied
    Registriert seit
    Feb 2009
    Ort
    München (Bayern)
    Beiträge
    23
    Beratungsresistenz? Ich sagte ja, die schönere Lösung ist sicherlich, wenn man dazu eine Klasse anlegt. Ist formal sicherlich eine saubere Lösung. z.B. eine Klasse User mit den Werten id, Nachname, Vorname zu bauen. Diese vielleicht noch mit einer Hashmap verwaltet...

    Jedoch bin ich davon ausgegangen, dass er vielleicht eher ein Einsteiger ist, und eine einfache, leicht zu überschauende Lösung gerne hätte. Und da ist es, natürlich je nach Ansichtssache, eine leichter überschaubarere Lösung einfach die Daten in Arrays zu verwalten. Aber stimmt natürlich, ist keine schöne Lösung 3 Arrays (id, vorname und nachname) zu bauen - ist eben zweckmäßig.
     
    Bildung kommt von Bildschirm und nicht von Buch, sonst hieße es ja Buchung.

  10. #10
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Auch als Einsteiger sollte man lernen, die richtige Abstraktionsstufe zu finden. Und daher ist Zejas Vorschlag in meinen Augen der einzig richtige. IMHO bringt es nichts, Einsteiger künstlich klein zu halten und quasi auf Händen und Knien mit rudimentärsten Datentypen kämpfen zu lassen und sich so das Leben unnötig schwer zu machen. Im Gegenteil - an diesem Beispiel zeigt sich recht schön und simpel wie das Bilden von Klassen Code vereinfacht und sprechender macht.

    Oder andersrum gefragt? Wann würdest du denn sonst einem "Einsteiger" (definiert das mal bitte jemand? empfehlen eine Klasse für ein Konstrukt anzulegen?

    Gruß
    Ollie
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

Ähnliche Themen

  1. Java Datenbank fehlt
    Von EuropaChat im Forum Java
    Antworten: 2
    Letzter Beitrag: 12.09.10, 10:56
  2. Datenbank (DDL) und Java
    Von Poxy im Forum Java
    Antworten: 1
    Letzter Beitrag: 09.05.08, 17:35
  3. Java und Datenbank
    Von hadda im Forum Java
    Antworten: 16
    Letzter Beitrag: 10.04.08, 14:33
  4. datenbank erstellen mit java
    Von KiteRider im Forum Java
    Antworten: 5
    Letzter Beitrag: 27.11.07, 08:01
  5. Datenbank unter Java und .NET
    Von BugsBastard im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 04.03.06, 11:19