Textvorschläge aus der Datenbank

Knutonier

Mitglied
Hallo alle zusammen :)
Ich habe mit Java ein Programm erstellt, das auf eine SQL Datenbank zugreift.
Jetzt würde ich gerne einen Textvorschlag haben.
Beispiel:
Ich gebe im Programm in ein Jtxtfield den Kundennamen ein. Jetzt möchte ich, dass er mir durch die ersten drei Buchstaben Vorschläge gibt aus Kundennamen, die in der Datenbank vorhanden sind. Die Vorschläge möchte ich anklicken können und dieser wird dann im Jtxtfield angezeigt.

Meine Fragen:
1. Welche Action muss ich dem Textfeld zuweisen? (kann ich hier key: released oder typed verwenden?)

2. Geht das überhaupt mit einem Jtxtfield oder muss ich ein anderes Feld verwenden? bzw. Muss ich ein Jtxtfield und eine Jlist erstellen in der ich dann die Vorschläge anzeigen kann?

3. Zugriff auf die Datenbank: Ich hatte mir das jetzt so Vorgestellt, dass ich mir ein ResultSet erstelle, welches in einer while-Schleife jeden Punkt einer bestimmten Spalte in der DB durchgeht und mir jeden Kundennamen in einer Variable abspeichert den er mit diesen Anfangsbuchstaben findet. Wie erstelle ich x Variablen in einer while-Schleife ohne vorher zu wissen wie viele Variablen ich benötige?


Danke schonmal im voraus :)

LG Knutonier
 

Joose

Top Contributor
1. Welche Action muss ich dem Textfeld zuweisen? (kann ich hier key: released oder typed verwenden?)
Ja kannst du und wäre auch sinnvoll ;)

2. Geht das überhaupt mit einem Jtxtfield oder muss ich ein anderes Feld verwenden? bzw. Muss ich ein Jtxtfield und eine Jlist erstellen in der ich dann die Vorschläge anzeigen kann?
Ja ein JTextfield brauchst du dazu. Das Stichwort zur Komponente heißt "autocomplete"
Hier mal ein Link: http://stackoverflow.com/questions/...mpleting-textbox-in-java-with-a-dropdown-list

Wie erstelle ich x Variablen in einer while-Schleife ohne vorher zu wissen wie viele Variablen ich benötige?
Wie wäre es mit einer Liste?
 

Knutonier

Mitglied
Soo, ich hab jetzt soweit alles hinbekommen.Das einzige Problem ist, dass er ab und zu die PopUpBox nicht verschwinden lässt. Das nervt etwas. Ich habe jetzt 10x das Programm gestartet und 10x das selbe eingegeben. Manchmal lässt er die Box da manchmal nicht. Weiß wer wieso?
 

Knutonier

Mitglied
Ok wenn ich das zweite mal eine Auswahl anklicken möchte bleibt das PopUpFenster da. Beim ersten mal geht es weg.
Hier greife ich auf die DB zu und speichere mir die KundenNamen in einer Array List.
Java:
txtBootsname = new JTextField();
txtBootsname.addKeyListener(new KeyAdapter() {
   @Override
   public void keyTyped(KeyEvent arg0) {
     AutoSuggestor autoSuggestor = new AutoSuggestor(txtBootsname, frmKassensoftware, null, Color.WHITE.brighter(), Color.BLUE, Color.RED, 0.75f) {
       @Override
       boolean wordTyped(String typedWord) {
         //create list for dictionary this in your case might be done via calling a method which queries db and returns results as arraylist
         ArrayList<String> words = new ArrayList<>();

         Connection conn = null;
         Statement statement = null;
         ResultSet resultSet = null;
         try {
           conn = Datenbankzugriff.einloggen(properties);
         } catch (ClassNotFoundException | IOException | SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
         }
         try {
           statement = conn.createStatement();
         } catch (SQLException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
         }
         try {
           resultSet = statement.executeQuery("SELECT * FROM dbo.Kunde");
         } catch (SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
         } //run your query
         try {
           while (resultSet.next()) //go through each row that your query returns
           {
             String itemBootsname = resultSet.getString("Bootsname"); //get the element in column "item_code"
             words.add(itemBootsname); //add each item to the model   
           }
         } catch (SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
         }
         try {
           resultSet.close();
         } catch (SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
         }
         try {
           statement.close();
         } catch (SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
         }
         setDictionary(words);
         //addToDictionary("bye");//adds a single word
         return super.wordTyped(typedWord);//now call super to check for any matches against newest dictionary
       }
     };
   }
});

Hier wird geprüft ob die Namen übereinstimmen und das PupUpFenster wird konfiguriert.
Java:
class AutoSuggestor {

    private final JTextField textField;
    private final Window container;
    private JPanel suggestionsPanel;
    private JWindow autoSuggestionPopUpWindow;
    private String typedWord;
    private final ArrayList<String> dictionary = new ArrayList<>();
    private int currentIndexOfSpace, tW, tH;
    private DocumentListener documentListener = new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent de) {
            checkForAndShowSuggestions();
        }

        @Override
        public void removeUpdate(DocumentEvent de) {
            checkForAndShowSuggestions();
        }

        @Override
        public void changedUpdate(DocumentEvent de) {
            checkForAndShowSuggestions();
        }
    };
    private final Color suggestionsTextColor;
    private final Color suggestionFocusedColor;

    public AutoSuggestor(JTextField textField, Window mainWindow, ArrayList<String> words, Color popUpBackground, Color textColor, Color suggestionFocusedColor, float opacity) {
        this.textField = textField;
        this.suggestionsTextColor = textColor;
        this.container = mainWindow;
        this.suggestionFocusedColor = suggestionFocusedColor;
        this.textField.getDocument().addDocumentListener(documentListener);

        setDictionary(words);

        typedWord = "";
        currentIndexOfSpace = 0;
        tW = 0;
        tH = 0;

        autoSuggestionPopUpWindow = new JWindow(mainWindow);
        autoSuggestionPopUpWindow.setOpacity(opacity);

        suggestionsPanel = new JPanel();
        suggestionsPanel.setLayout(new GridLayout(0, 1));
        suggestionsPanel.setBackground(popUpBackground);

        addKeyBindingToRequestFocusInPopUpWindow();
    }

    private void addKeyBindingToRequestFocusInPopUpWindow() {
        textField.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "Down released");
        textField.getActionMap().put("Down released", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {//focuses the first label on popwindow
                for (int i = 0; i < suggestionsPanel.getComponentCount(); i++) {
                    if (suggestionsPanel.getComponent(i) instanceof SuggestionLabel) {
                        ((SuggestionLabel) suggestionsPanel.getComponent(i)).setFocused(true);
                        autoSuggestionPopUpWindow.toFront();
                        autoSuggestionPopUpWindow.requestFocusInWindow();
                        suggestionsPanel.requestFocusInWindow();
                        suggestionsPanel.getComponent(i).requestFocusInWindow();
                        break;
                    }
                }
            }
        });
        suggestionsPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "Down released");
        suggestionsPanel.getActionMap().put("Down released", new AbstractAction() {
            int lastFocusableIndex = 0;

            @Override
            public void actionPerformed(ActionEvent ae) {//allows scrolling of labels in pop window (I know very hacky for now :))

                ArrayList<SuggestionLabel> sls = getAddedSuggestionLabels();
                int max = sls.size();

                if (max > 1) {//more than 1 suggestion
                    for (int i = 0; i < max; i++) {
                        SuggestionLabel sl = sls.get(i);
                        if (sl.isFocused()) {
                            if (lastFocusableIndex == max - 1) {
                                lastFocusableIndex = 0;
                                sl.setFocused(false);
                                autoSuggestionPopUpWindow.setVisible(false);
                                setFocusToTextField();
                                checkForAndShowSuggestions();//fire method as if document listener change occured and fired it

                            } else {
                                sl.setFocused(false);
                                lastFocusableIndex = i;
                            }
                        } else if (lastFocusableIndex <= i) {
                            if (i < max) {
                                sl.setFocused(true);
                                autoSuggestionPopUpWindow.toFront();
                                autoSuggestionPopUpWindow.requestFocusInWindow();
                                suggestionsPanel.requestFocusInWindow();
                                suggestionsPanel.getComponent(i).requestFocusInWindow();
                                lastFocusableIndex = i;
                                break;
                            }
                        }
                    }
                } else {//only a single suggestion was given
                    autoSuggestionPopUpWindow.setVisible(false);
                    setFocusToTextField();
                    checkForAndShowSuggestions();//fire method as if document listener change occured and fired it
                    autoSuggestionPopUpWindow.setVisible(false);
                }
            }
        });
    }

    private void setFocusToTextField() {
        container.toFront();
        container.requestFocusInWindow();
        textField.requestFocusInWindow();
      
    }

    public ArrayList<SuggestionLabel> getAddedSuggestionLabels() {
        ArrayList<SuggestionLabel> sls = new ArrayList<>();
        for (int i = 0; i < suggestionsPanel.getComponentCount(); i++) {
            if (suggestionsPanel.getComponent(i) instanceof SuggestionLabel) {
                SuggestionLabel sl = (SuggestionLabel) suggestionsPanel.getComponent(i);
                sls.add(sl);
            }
        }
        return sls;
    }

    private void checkForAndShowSuggestions() {
        typedWord = getCurrentlyTypedWord();

        suggestionsPanel.removeAll();//remove previos words/jlabels that were added

        //used to calcualte size of JWindow as new Jlabels are added
        tW = 0;
        tH = 0;

        boolean added = wordTyped(typedWord);

        if (!added) {
            if (autoSuggestionPopUpWindow.isVisible()) {
                autoSuggestionPopUpWindow.setVisible(false);
            }
        } else {
            showPopUpWindow();
            setFocusToTextField();
          
        }
    }

    protected void addWordToSuggestions(String word) {
        SuggestionLabel suggestionLabel = new SuggestionLabel(word, suggestionFocusedColor, suggestionsTextColor, this);

        calculatePopUpWindowSize(suggestionLabel);

        suggestionsPanel.add(suggestionLabel);
    }

    public String getCurrentlyTypedWord() {//get newest word after last white spaceif any or the first word if no white spaces
        String text = textField.getText();
        String wordBeingTyped = "";
        if (text.contains(" ")) {
            int tmp = text.lastIndexOf(" ");
            if (tmp >= currentIndexOfSpace) {
                currentIndexOfSpace = tmp;
                wordBeingTyped = text.substring(text.lastIndexOf(" "));
            }
        } else {
            wordBeingTyped = text;
        }
        return wordBeingTyped.trim();
    }

    private void calculatePopUpWindowSize(JLabel label) {
        //so we can size the JWindow correctly
        if (tW < label.getPreferredSize().width) {
            tW = label.getPreferredSize().width;
        }
        tH += label.getPreferredSize().height;
    }

    private void showPopUpWindow() {
        autoSuggestionPopUpWindow.getContentPane().add(suggestionsPanel);
        autoSuggestionPopUpWindow.setMinimumSize(new Dimension(textField.getWidth(), 30));
        autoSuggestionPopUpWindow.setSize(tW, tH);
        autoSuggestionPopUpWindow.setVisible(true);

        int windowX = 0;
        int windowY = 0;

        windowX = container.getX() + textField.getX() + 5;
        if (suggestionsPanel.getHeight() > autoSuggestionPopUpWindow.getMinimumSize().height) {
            windowY = container.getY() + textField.getY() + textField.getHeight() + autoSuggestionPopUpWindow.getMinimumSize().height;
        } else {
            windowY = container.getY() + textField.getY() + textField.getHeight() + autoSuggestionPopUpWindow.getHeight();
        }

        autoSuggestionPopUpWindow.setLocation(windowX, windowY);
        autoSuggestionPopUpWindow.setMinimumSize(new Dimension(textField.getWidth(), 30));
        autoSuggestionPopUpWindow.revalidate();
        autoSuggestionPopUpWindow.repaint();

    }

    public void setDictionary(ArrayList<String> words) {
        dictionary.clear();
        if (words == null) {
            return;//so we can call constructor with null value for dictionary without exception thrown
        }
        for (String word : words) {
            dictionary.add(word);
        }
    }

    public JWindow getAutoSuggestionPopUpWindow() {
        return autoSuggestionPopUpWindow;
    }

    public Window getContainer() {
        return container;
    }

    public JTextField getTextField() {
        return textField;
    }

    public void addToDictionary(String word) {
        dictionary.add(word);
    }

    boolean wordTyped(String typedWord) {

        if (typedWord.isEmpty()) {
            return false;
        }
        //System.out.println("Typed word: " + typedWord);

        boolean suggestionAdded = false;

        for (String word : dictionary) {//get words in the dictionary which we added
            boolean fullymatches = true;
            for (int i = 0; i < typedWord.length(); i++) {//each string in the word
                if (!typedWord.toLowerCase().startsWith(String.valueOf(word.toLowerCase().charAt(i)), i)) {//check for match
                    fullymatches = false;
                    break;
                }
            }
            if (fullymatches) {
                addWordToSuggestions(word);
                suggestionAdded = true;
              
            }
        }
        return suggestionAdded;
    }
}

Hier wird der ausgewählte Name aus der Liste in das TextFeld geschrieben:
Java:
class SuggestionLabel extends JLabel {

    private boolean focused = false;
    private final JWindow autoSuggestionsPopUpWindow;
    private final JTextField textField;
    private final AutoSuggestor autoSuggestor;
    private Color suggestionsTextColor, suggestionBorderColor;

    public SuggestionLabel(String string, final Color borderColor, Color suggestionsTextColor, AutoSuggestor autoSuggestor) {
        super(string);

        this.suggestionsTextColor = suggestionsTextColor;
        this.autoSuggestor = autoSuggestor;
        this.textField = autoSuggestor.getTextField();
        this.suggestionBorderColor = borderColor;
        this.autoSuggestionsPopUpWindow = autoSuggestor.getAutoSuggestionPopUpWindow();

        initComponent();
    }

    private void initComponent() {
        setFocusable(true);
        setForeground(suggestionsTextColor);

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);

                replaceWithSuggestedText();

                autoSuggestionsPopUpWindow.setVisible(false);
            }
        });

        getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "Enter released");
        getActionMap().put("Enter released", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                replaceWithSuggestedText();
                autoSuggestionsPopUpWindow.setVisible(false);
            }
        });
    }

    public void setFocused(boolean focused) {
        if (focused) {
            setBorder(new LineBorder(suggestionBorderColor));
        } else {
            setBorder(null);
        }
        repaint();
        this.focused = focused;
    }

    public boolean isFocused() {
        return focused;
    }

    private void replaceWithSuggestedText() {
        String suggestedWord = getText();
        String text = textField.getText();
        String typedWord = autoSuggestor.getCurrentlyTypedWord();
        String t = text.substring(0, text.lastIndexOf(typedWord));
        String tmp = t + text.substring(text.lastIndexOf(typedWord)).replace(typedWord, suggestedWord);
        tmp  = tmp.replaceAll(" ", "");
      
        textField.setText(tmp);
        autoSuggestionsPopUpWindow.setVisible(false);
    }
}

Ich habe hauptsächlich Copy and Paste gemacht und alles soweit angepasst, dass es in meinem Programm und in meiner UI funktioniert.
LG Knutonier
Danke nochmal :)
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Java:
try {
   conn = Datenbankzugriff.einloggen(properties);
} catch (ClassNotFoundException | IOException | SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
try {
   statement = conn.createStatement();
} catch (SQLException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
}
try {
   resultSet = statement.executeQuery("SELECT * FROM dbo.Kunde");
} catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
} //run your query
try {
   while (resultSet.next()) //go through each row that your query returns
   {
     String itemBootsname = resultSet.getString("Bootsname"); //get the element in column "item_code"
     words.add(itemBootsname); //add each item to the model 
   }
} catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
try {
   resultSet.close();
} catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
try {
   statement.close();
} catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

Warum hast du für jedes einzelne Statement einen eigenen try/catch-Block deklariert? Das macht den Code doch nur unnötig lang.
Außerdem werden dadurch vielleicht ungewollt NullPointerExceptions erzeugt. Beispiel: Das executeQuery schlägt fehl und "resultSet" bleibt null.

Java:
try {
   conn = Datenbankzugriff.einloggen(properties);
   statement = conn.createStatement();
   resultSet = statement.executeQuery("SELECT * FROM dbo.Kunde");
   while (resultSet.next()) //go through each row that your query returns
   {
     String itemBootsname = resultSet.getString("Bootsname"); //get the element in column "item_code"
     words.add(itemBootsname); //add each item to the model 
   }
   resultSet.close();
   statement.close();
} catch (ClassNotFoundException | IOException | SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
 

Knutonier

Mitglied
Hier nochmal Bilder zur Veranschaulichung:
Das Textfeld neben "Bootsname" hat die AutoSuggestor Funktion.
Kassensoftware.PNG

Das PopUp-Fesnter verschwindet beim ersten mal anklicken.
Beim zweiten mal bleibt es dauerhaft da. Das möchte ich nicht.
PopUp.PNG
 

Robat

Top Contributor
Ich habe mal noch eine Verständnis Frage:

Du hast ja gesagt, dass der Dialog bleibt nach du ein zweites mal hinein klickst.
Hast du da den Inhalt vorher gelöscht oder steht der noch drin?

Also ist das JTextField leer bevor du ein zweites mal hinein klickst oder steht (zum Bleistift) Test noch drin?

Gruß
Robert
 

Knutonier

Mitglied
Test steht noch drin. Dann lösche ich den Inhalt ganz bzw. nur einen Buchstaben. Dann gibt er mir ja wieder Vorschläge. Wenn ich dann auf einen Vorschlag klicke bleibt das PopUp-Fenster stehen.
 

Robat

Top Contributor
Soo... ich glaube den Fehler gefunden zu haben:

Java:
txtBootsname.addKeyListener(new KeyAdapter() {
   @Override
   public void keyTyped(KeyEvent arg0) {
           ...
   }
});

Du musst den KeyListener raus nehmen - dann sollte es funktionieren :)
Mal davon abgesehen, dass ich nicht ganz verstehe warum du den KeyListener überhaupt implementiert hast ;)



Gruß
Robert
 

Joose

Top Contributor
Mal davon abgesehen, dass ich nicht ganz verstehe warum du den KeyListener überhaupt implementiert hast ;)
Damit er bei jeden Buchstaben den er eingibt neu suchen kann? ;)
Oder wie sollte sonst die Suche bei einem Autocomplete Feld angestoßen werden? (ja textchanged würde auch gehen)

Das Problem liegt eher darin das du bei jeden Tastendruck ein neues Objekt von "AutoSuggestor" erstellst und für jedes dieser Objekte ein Panel angezeigt wird.
 

Robat

Top Contributor
Damit er bei jeden Buchstaben den er eingibt neu suchen kann? ;)
Oder wie sollte sonst die Suche bei einem Autocomplete Feld angestoßen werden? (ja textchanged würde auch gehen)

Meinst du damit, dass er nach jedem Buchstaben die Liste aktualisiert? Weil das macht er auch ohne KeyListener.
Oder reden wir gerade an einander vorbei?
 

Knutonier

Mitglied
Wahrscheinlich, weil ich noch nicht ganz die Logik von der AutoSuggestion Klasse verstanden habe :/
Ich dachte es müsste irgendwie noch ausgelöst werden.

Das funktioniert jetzt einwandfrei! Danke!

Jetzt würde ich noch gerne die Felder "Länge" und "Verein" mit den Daten aus der Zeile füllen in der ich den Namen ausgewählt habe. Das Problem hier ist ich nehme ja durch die Speicherung des Bootsnamen in einer Array-List den Bezug zur Datenbank.

Momentan mache ich das so:
Wenn ich in das Feld "Länge" klicke prüft er nach einem Namen der im Feld "Bootsname" steht und gibt dazu die Felder "Länge" und "Verein" aus. Gibt es den Namen aber 2x oder häufiger nimmt er den ersten den er findet.

Code:
txtLnge = new JTextField();
        txtLnge.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e1) {
                String bootsname = txtBootsname.getText();
                String laenge1=null;
                String verein1 = null;
               
                try {
                    bootsname = Kunden.pruefbootsname(properties,bootsname);
                } catch (ClassNotFoundException | IOException | SQLException e) {
                   
                    JOptionPane.showMessageDialog(null, e.toString(), "Error",
                            JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                }
               
               
               
                try {
                    laenge1 = Kunden.prueflnge(properties,bootsname);
                } catch (ClassNotFoundException | IOException | SQLException e) {
                    JOptionPane.showMessageDialog(null, e.toString(), "Error",
                            JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                }
               
                txtLnge.setText(laenge1);
               
                try {
                    verein1 = Kunden.pruefverein(properties,bootsname);
                } catch (ClassNotFoundException | IOException | SQLException e) {
                    JOptionPane.showMessageDialog(null, e.toString(), "Error",
                            JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                }
              
                txtVerein.setText(verein1);
               
            }
        });

Dies würde ich jetzt gerne mit der Logik des PopUp-Fensters verbinden. Ich weiß aber nicht wie.
Versuche schon seit 2Std die Logik zu verstehen um dort irgendwie die Felder zu füllen.
 

Knutonier

Mitglied
Hier einmal die Methoden aus der Klasse Kunden:
Code:
public static String pruefbootsname(Properties properties, String bootsname) throws ClassNotFoundException, IOException, SQLException {
       
        Connection conn = Datenbankzugriff.einloggen(properties);
        Statement stmt = null;
        String aktbootsn = null;
        String strNewText = null;
        try {
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM Kunde WHERE Bootsname='" + bootsname + "'");
           
            if(rs.next()){
                aktbootsn=rs.getString(2);
                strNewText   = aktbootsn.replaceAll(" ", "");
        }
           
       
       
        return strNewText;
        // TODO Auto-generated method stub
       
    }
        finally {
            if (stmt != null) {
              stmt.close();
            }
       
      
          }
}

    public static String prueflnge(Properties properties, String bootsname) throws SQLException, ClassNotFoundException, IOException {
        Connection conn = Datenbankzugriff.einloggen(properties);
        Statement stmt = null;
        String lnge = null;
        String strNewText = null;
       
        try {
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM Kunde WHERE Bootsname='" + bootsname + "'");
           
            if(rs.next()){
                lnge=rs.getString(3);
                strNewText   = lnge.replaceAll(" ", "");
        }
           
       
        return strNewText;
        // TODO Auto-generated method stub
       
    }
        finally {
            if (stmt != null) {
              stmt.close();
            }
       
      
          }
    }

    public static String pruefverein(Properties properties, String bootsname) throws ClassNotFoundException, IOException, SQLException {
        Connection conn = Datenbankzugriff.einloggen(properties);
        Statement stmt = null;
        String verein = null;
        String strNewText = null;
       
        try {
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM Kunde WHERE Bootsname='" + bootsname + "'");
           
            if(rs.next()){
                verein=rs.getString(4);
                strNewText   = verein.replaceAll(" ", "");
        }
           
       
        return strNewText;
        // TODO Auto-generated method stub
       
    }
        finally {
            if (stmt != null) {
              stmt.close();
            }
       
      
          }
    }}
 

Robat

Top Contributor
Willst du,
dass das Pop-Up automatisch angezeigt wird mit allen Vorschlägen
oder
dass du den selben Effekt hast wie bei deinem Boottextfield - also das je nach Input dein Pop-UP angezeigt wird?
 

Joose

Top Contributor
Meinst du damit, dass er nach jedem Buchstaben die Liste aktualisiert? Weil das macht er auch ohne KeyListener
Genau das meinte ich. Aha und auf Grund welches Code macht er das ohne KeyListener?
Sobald ich bei einem Feld (mit Autocomplete) ein Zeichen (Zahl, Buchstabe oder Sonderzeichen) eingebe wird die Auswahl weiter gefiltert. Ob hier nun komplett neu gesucht wird oder die Liste nur gefiltert wird ist egal. Aber bei jedem Tastendruck wird etwas getan. Ich wüsste nicht wie es ohne KeyListener also funktionieren sollte.

Jetzt würde ich noch gerne die Felder "Länge" und "Verein" mit den Daten aus der Zeile füllen in der ich den Namen ausgewählt habe. Das Problem hier ist ich nehme ja durch die Speicherung des Bootsnamen in einer Array-List den Bezug zur Datenbank.
Dann lies nicht nur den Bootsnamen aus und speicher diesen in einer String Liste sondern lies alle benötigten Daten aus, wandel diese in ein Boot Objekt um und speicher das ganze in einer Boot Liste.
Wenn du nun auf einen Eintrag des PopUp klickst hast du das dazugehörige Boot Objekt mit den Daten für Länge und Verein
 

Robat

Top Contributor
Genau das meinte ich. Aha und auf Grund welches Code macht er das ohne KeyListener?
Sobald ich bei einem Feld (mit Autocomplete) ein Zeichen (Zahl, Buchstabe oder Sonderzeichen) eingebe wird die Auswahl weiter gefiltert. Ob hier nun komplett neu gesucht wird oder die Liste nur gefiltert wird ist egal. Aber bei jedem Tastendruck wird etwas getan. Ich wüsste nicht wie es ohne KeyListener also funktionieren sollte.

https://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html

void changedUpdate(DocumentEvent e)
Gives notification that an attribute or set of attributes changed.

void insertUpdate(DocumentEvent e)
Gives notification that there was an insert into the document.

void removeUpdate(DocumentEvent e)
Gives notification that a portion of the document has been removed.
 

Knutonier

Mitglied
Wie kann ich denn in dem AutoSuggestor mit einem Objekt umgehen?
Am Ende (Suggestion Label)
Code:
private void replaceWithSuggestedText() {
        String suggestedWord = getText();
        String text = textField.getText();
        String typedWord = autoSuggestor.getCurrentlyTypedWord();
        String t = text.substring(0, text.lastIndexOf(typedWord));
        String tmp = t + text.substring(text.lastIndexOf(typedWord)).replace(typedWord, suggestedWord);
        tmp  = tmp.replaceAll(" ", "");
      
        textField.setText(tmp);
        autoSuggestionsPopUpWindow.setVisible(false);
    }
gebe ich ja einen String in das textField ein. Wie kann ich da mit einem Objekt umgehen?
 

Robat

Top Contributor
Um dein Plan zu realiseren und Code zu sparen, könntest du dir auch einen Manager schreiben wo du
Java:
try {
   conn = Datenbankzugriff.einloggen(properties);
   statement = conn.createStatement();
   resultSet = statement.executeQuery("SELECT * FROM dbo.Kunde");
   while (resultSet.next()) //go through each row that your query returns
   {
     String itemBootsname = resultSet.getString("Bootsname"); //get the element in column "item_code"
     words.add(itemBootsname); //add each item to the model
   }
   resultSet.close();
   statement.close();
} catch (ClassNotFoundException | IOException | SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

und den code für den Suggestor:

Java:
 AutoSuggestor autoSuggestor = new AutoSuggestor(txtBootsname, frmKassensoftware, null, Color.WHITE.brighter(), Color.BLUE, Color.RED, 0.75f) {
       @Override
       boolean wordTyped(String typedWord) {
         //create list for dictionary this in your case might be done via calling a method which queries db and returns results as arraylist
         ArrayList<String> words = new ArrayList<>();

     //...

in eine eigene Methode schreibst, die du im Konstruktor aufrufst.
(Im Bsp ist alles im Konstruktor gemacht --> ist aber dirty - mach lieber eine eigene methode wo du die Vars noch mal übergibst :) )

So kannst du dann mit einer Zeile jedes JTextField zu dem Suggestor hinzufügen.

Beispiel:

Java:
public class SuggestManager
{

    private ArrayList<String> words = new ArrayList<>();
    private JTextField txtField;
    private JFrame f;
    private String itemName;

    public SuggestManager(JTextField txtField, JFrame f, String itemName)
    {
        // Initialization
        this.txtField = txtField;
        this.f        = f;
        this.itemName = itemName;
   
        // DATENBANKCODE
        //...
        String item = resultSet.getString(itemName);
        words.add(item);
   
        //...
        // AUTOSUGGESTOR
        AutoSuggestor s = new AutoSuggestor(textField, f, null, ..)
        {
           // ..
        };
    }

Und dann immer an der jeweiligen Stelle den Konstruktor aufrufen.
Kurz zur erklärung:
txtField --> bootsName, Länge, ...
f --> dein JFrame
itemName --> der Name der Prop die du willst


zu deinem letzten Post: Du musst es nicht mit einem objekt machen.
Strings reichen da mMn völlig aus. Wenn du Zahlen hast kannst du sie mit String.valueOf(zahl) umwandeln.

Hoffentlich ist alles verständlich - wenn nicht frag nach!

PS: Was @Joose angesprochen hat funktioniert natürlich auch. Du musst eben deine Suggestor Klasse ein wenig abändern.

Gruß Robert
 

Knutonier

Mitglied
Das klingt sehr gut! Danke :)
Ich versuche das einmal umzusetzen und schaue wie weit ich komme.
Ich melde mich dann morgen und geb dann meine Erfolge zum Besten ;)

LG Knut
 

Knutonier

Mitglied
Super Leute!
Hab es geschafft :)
Hier einmal der Aufruf der AutoSuggestor Klasse:
Code:
txtBootsname = new JTextField();
        txtBootsname.setEnabled(false);
       
                AutoSuggestor autoSuggestor = new AutoSuggestor(txtBootsname, txtLnge, txtVerein, frmKassensoftware, null, Color.WHITE.brighter(), Color.BLUE, Color.RED, 0.75f) {
                    @Override
                    boolean wordTyped(String typedWord) {

                        //create list for dictionary this in your case might be done via calling a method which queries db and returns results as arraylist
                        ArrayList<Object[]> words = new ArrayList<>();
                        Connection conn = null;
                        Statement statement = null;
                        ResultSet resultSet = null;
                       
                       
                        try {
                            conn = Datenbankzugriff.einloggen(properties);              
                            statement = conn.createStatement();
                            resultSet = statement.executeQuery("SELECT * FROM dbo.Kunde");
                            while (resultSet.next()) //go through each row that your query returns
                            {  
                                String itemBootsname = resultSet.getString("Bootsname"); //get the element in column "item_code"
                                String itemVerein = resultSet.getString("Verein");
                                String itemLnge = resultSet.getString("Laenge");
                               
                                Object[] kundenArray = new Object[3];
                                kundenArray[0] = itemBootsname;
                                kundenArray[1] = itemLnge;
                                kundenArray[2] = itemVerein;
                               
                                words.add(kundenArray); //add each item to the model
                            }
                            resultSet.close();
                            statement.close();
                          
                        } catch (ClassNotFoundException | IOException | SQLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                                             
                        setDictionary(words);
                        //addToDictionary("bye");//adds a single word

                        return super.wordTyped(typedWord);//now call super to check for any matches against newest dictionary
                       
                    }
                   
                };
Ich gebe einfach ein Object[] mit und die beiden zusätzlichen txtFields.

In der Klasse AutoSuggestor habe ich das Object[] in das Dictionary eingebunden und die beiden txtFields in eine globale Variable geschrieben.
Code:
class AutoSuggestor {

    private final JTextField textField;
    private final JTextField textFieldLnge;
    private final JTextField textFieldVerein;
    private final Window container;
    private JPanel suggestionsPanel;
    private JWindow autoSuggestionPopUpWindow;
    private String typedWord;
    private final ArrayList<Object[]> dictionary = new ArrayList<>();
    private int currentIndexOfSpace, tW, tH;
    private DocumentListener documentListener = new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent de) {
            checkForAndShowSuggestions();
        }

        @Override
        public void removeUpdate(DocumentEvent de) {
            checkForAndShowSuggestions();
        }

        @Override
        public void changedUpdate(DocumentEvent de) {
            checkForAndShowSuggestions();
        }
    };
    private final Color suggestionsTextColor;
    private final Color suggestionFocusedColor;

    public AutoSuggestor(JTextField textField, JTextField textFieldLnge, JTextField textFieldVerein, Window mainWindow, ArrayList<Object[]> words, Color popUpBackground, Color textColor, Color suggestionFocusedColor, float opacity) {
        this.textField = textField;
        this.textFieldLnge = textFieldLnge;
        this.textFieldVerein = textFieldVerein;
        this.suggestionsTextColor = textColor;
        this.container = mainWindow;
        this.suggestionFocusedColor = suggestionFocusedColor;
        this.textField.getDocument().addDocumentListener(documentListener);

        setDictionary(words);

        typedWord = "";
        currentIndexOfSpace = 0;
        tW = 0;
        tH = 0;

        autoSuggestionPopUpWindow = new JWindow(mainWindow);
        autoSuggestionPopUpWindow.setOpacity(opacity);

        suggestionsPanel = new JPanel();
        suggestionsPanel.setLayout(new GridLayout(0, 1));
        suggestionsPanel.setBackground(popUpBackground);

        addKeyBindingToRequestFocusInPopUpWindow();
    }

    private void addKeyBindingToRequestFocusInPopUpWindow() {
        textField.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "Down released");
        textField.getActionMap().put("Down released", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {//focuses the first label on popwindow
                for (int i = 0; i < suggestionsPanel.getComponentCount(); i++) {
                    if (suggestionsPanel.getComponent(i) instanceof SuggestionLabel) {
                        ((SuggestionLabel) suggestionsPanel.getComponent(i)).setFocused(true);
                        autoSuggestionPopUpWindow.toFront();
                        autoSuggestionPopUpWindow.requestFocusInWindow();
                        suggestionsPanel.requestFocusInWindow();
                        suggestionsPanel.getComponent(i).requestFocusInWindow();
                        break;
                    }
                }
            }
        });
        suggestionsPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "Down released");
        suggestionsPanel.getActionMap().put("Down released", new AbstractAction() {
            int lastFocusableIndex = 0;

            @Override
            public void actionPerformed(ActionEvent ae) {//allows scrolling of labels in pop window (I know very hacky for now :))

                ArrayList<SuggestionLabel> sls = getAddedSuggestionLabels();
                int max = sls.size();

                if (max > 1) {//more than 1 suggestion
                    for (int i = 0; i < max; i++) {
                        SuggestionLabel sl = sls.get(i);
                        if (sl.isFocused()) {
                            if (lastFocusableIndex == max - 1) {
                                lastFocusableIndex = 0;
                                sl.setFocused(false);
                                autoSuggestionPopUpWindow.setVisible(false);
                                setFocusToTextField();
                                checkForAndShowSuggestions();//fire method as if document listener change occured and fired it

                            } else {
                                sl.setFocused(false);
                                lastFocusableIndex = i;
                            }
                        } else if (lastFocusableIndex <= i) {
                            if (i < max) {
                                sl.setFocused(true);
                                autoSuggestionPopUpWindow.toFront();
                                autoSuggestionPopUpWindow.requestFocusInWindow();
                                suggestionsPanel.requestFocusInWindow();
                                suggestionsPanel.getComponent(i).requestFocusInWindow();
                                lastFocusableIndex = i;
                                break;
                            }
                        }
                    }
                } else {//only a single suggestion was given
                    autoSuggestionPopUpWindow.setVisible(false);
                    setFocusToTextField();
                    checkForAndShowSuggestions();//fire method as if document listener change occured and fired it
                    autoSuggestionPopUpWindow.setVisible(false);
                }
            }
        });
    }

    private void setFocusToTextField() {
        container.toFront();
        container.requestFocusInWindow();
        textField.requestFocusInWindow();
       
    }

    public ArrayList<SuggestionLabel> getAddedSuggestionLabels() {
        ArrayList<SuggestionLabel> sls = new ArrayList<>();
        for (int i = 0; i < suggestionsPanel.getComponentCount(); i++) {
            if (suggestionsPanel.getComponent(i) instanceof SuggestionLabel) {
                SuggestionLabel sl = (SuggestionLabel) suggestionsPanel.getComponent(i);
                sls.add(sl);
            }
        }
        return sls;
    }

    private void checkForAndShowSuggestions() {
        typedWord = getCurrentlyTypedWord();

        suggestionsPanel.removeAll();//remove previos words/jlabels that were added

        //used to calcualte size of JWindow as new Jlabels are added
        tW = 0;
        tH = 0;

        boolean added = wordTyped(typedWord);

        if (!added) {
            if (autoSuggestionPopUpWindow.isVisible()) {
                autoSuggestionPopUpWindow.setVisible(false);
            }
        } else {
            showPopUpWindow();
            setFocusToTextField();
           
        }
    }

    protected void addWordToSuggestions(Object[] word) {
        SuggestionLabel suggestionLabel = new SuggestionLabel(word, suggestionFocusedColor, suggestionsTextColor, this);

        calculatePopUpWindowSize(suggestionLabel);

        suggestionsPanel.add(suggestionLabel);
    }

    public String getCurrentlyTypedWord() {//get newest word after last white spaceif any or the first word if no white spaces
        String text = textField.getText();
        String wordBeingTyped = "";
        if (text.contains(" ")) {
            int tmp = text.lastIndexOf(" ");
            if (tmp >= currentIndexOfSpace) {
                currentIndexOfSpace = tmp;
                wordBeingTyped = text.substring(text.lastIndexOf(" "));
            }
        } else {
            wordBeingTyped = text;
        }
        return wordBeingTyped.trim();
    }

    private void calculatePopUpWindowSize(JLabel label) {
        //so we can size the JWindow correctly
        if (tW < label.getPreferredSize().width) {
            tW = label.getPreferredSize().width;
        }
        tH += label.getPreferredSize().height;
    }

    private void showPopUpWindow() {
        autoSuggestionPopUpWindow.getContentPane().add(suggestionsPanel);
        autoSuggestionPopUpWindow.setMinimumSize(new Dimension(textField.getWidth(), 30));
        autoSuggestionPopUpWindow.setSize(tW, tH);
        autoSuggestionPopUpWindow.setVisible(true);

        int windowX = 0;
        int windowY = 0;

        windowX = container.getX() + textField.getX() + 15;
        if (suggestionsPanel.getHeight() > autoSuggestionPopUpWindow.getMinimumSize().height) {
            windowY = container.getY() + textField.getY() + textField.getHeight() + autoSuggestionPopUpWindow.getMinimumSize().height + (25);
        } else {
            windowY = container.getY() + textField.getY() + textField.getHeight() + autoSuggestionPopUpWindow.getHeight() + (25);
        }

        autoSuggestionPopUpWindow.setLocation(windowX, windowY);
        autoSuggestionPopUpWindow.setMinimumSize(new Dimension(textField.getWidth(), 30));
        autoSuggestionPopUpWindow.revalidate();
        autoSuggestionPopUpWindow.repaint();

    }

    public void setDictionary(ArrayList<Object[]> words) {
        dictionary.clear();
        if (words == null) {
            return;//so we can call constructor with null value for dictionary without exception thrown
        }
        for (Object[] word : words) {
            dictionary.add(word);
        }
    }

    public JWindow getAutoSuggestionPopUpWindow() {
        return autoSuggestionPopUpWindow;
    }

    public Window getContainer() {
        return container;
    }

    public JTextField getTextField() {
        return textField;
    }
    public JTextField getTextFieldLnge() {
        return textFieldLnge;
    }
    public JTextField getTextFieldVerein() {
        return textFieldVerein;
    }

    public void addToDictionary(Object[] word) {
        dictionary.add(word);
    }

    boolean wordTyped(String typedWord) {

        if (typedWord.isEmpty()) {
            return false;
        }
        //System.out.println("Typed word: " + typedWord);

        boolean suggestionAdded = false;

        for (Object[] array : dictionary) {//get words in the dictionary which we added
            String word = (String) array[0];
           
           
            boolean fullymatches = true;
            for (int i = 0; i < typedWord.length(); i++) {//each string in the word
                if (!typedWord.toLowerCase().startsWith(String.valueOf(word.toLowerCase().charAt(i)), i)) {//check for match
                    fullymatches = false;
                    break;
                }
            }
            if (fullymatches) {
                addWordToSuggestions(array);
                suggestionAdded = true;
               
            }
        }
        return suggestionAdded;
    }

In der Klasse SuggestionLabel zeige ich zusätzlich noch die anderen Parameter im PopUp-Fenster an um die Unterschiede anzugeben. Desweiteren wird das Array aufgeschlüsselt und alle drei Textfelder werden nach auswahl im PopUp-Fenster mit den richtigen Daten gefüllt :)
Code:
class SuggestionLabel extends JLabel {

    private boolean focused = false;
    private final JWindow autoSuggestionsPopUpWindow;
    private final JTextField textField;
    private final AutoSuggestor autoSuggestor;
    private Color suggestionsTextColor, suggestionBorderColor;
    private Object[] kundenArray;

    public SuggestionLabel(Object[] kundenArray, final Color borderColor, Color suggestionsTextColor, AutoSuggestor autoSuggestor) {
        super((String) kundenArray[0] + "  " + (String) kundenArray[1] + "  " + (String) kundenArray[2]);
       
        this.kundenArray = kundenArray;
        this.suggestionsTextColor = suggestionsTextColor;
        this.autoSuggestor = autoSuggestor;
        this.textField = autoSuggestor.getTextField();
        this.suggestionBorderColor = borderColor;
        this.autoSuggestionsPopUpWindow = autoSuggestor.getAutoSuggestionPopUpWindow();

        initComponent();
    }

    private void initComponent() {
        setFocusable(true);
        setForeground(suggestionsTextColor);

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);

                replaceWithSuggestedText();

                autoSuggestionsPopUpWindow.setVisible(false);
            }
        });

        getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "Enter released");
        getActionMap().put("Enter released", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                replaceWithSuggestedText();
                autoSuggestionsPopUpWindow.setVisible(false);
            }
        });
    }

    public void setFocused(boolean focused) {
        if (focused) {
            setBorder(new LineBorder(suggestionBorderColor));
        } else {
            setBorder(null);
        }
        repaint();
        this.focused = focused;
    }

    public boolean isFocused() {
        return focused;
    }

    private void replaceWithSuggestedText() {
        String suggestedWord = (String) kundenArray[0];
        String text = textField.getText();
        String typedWord = autoSuggestor.getCurrentlyTypedWord();
        String t = text.substring(0, text.lastIndexOf(typedWord));
        String tmp = t + text.substring(text.lastIndexOf(typedWord)).replace(typedWord, suggestedWord);
        tmp  = tmp.trim();
       
        textField.setText(tmp);
        autoSuggestor.getTextFieldLnge().setText(((String) kundenArray[1]).trim());
        autoSuggestor.getTextFieldVerein().setText(((String) kundenArray[2]).trim());
        autoSuggestionsPopUpWindow.setVisible(false);
    }
}
Das ganze sieht dann so aus :)
PopUp.PNG

Ihr habt mir alle sehr geholfen! Danke!

Wie kann ich kennzeichnen, dass der Thread gelöst ist?

LG Knut
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Tabelle zu Datenbank hinzufügen / Apache Derby AWT, Swing, JavaFX & SWT 7
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
M TableView + Datenbank Aktualisierung AWT, Swing, JavaFX & SWT 4
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
S Insert Umlaute in Datenbank AWT, Swing, JavaFX & SWT 5
J Suchmaschine einer Datenbank AWT, Swing, JavaFX & SWT 5
P JavaFX, TableView und Datenbank AWT, Swing, JavaFX & SWT 4
F JavaFX Von Datenbank in ListView AWT, Swing, JavaFX & SWT 4
kilopack15 Simple Datenbank mit AWT AWT, Swing, JavaFX & SWT 9
A checkbox mit allen tabllen aus datenbank befüllen AWT, Swing, JavaFX & SWT 8
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
M Combo Box auswahl in eine Datenbank speichern AWT, Swing, JavaFX & SWT 1
V Java FX POJO aus Datenbank in FX TableView / Best Practice AWT, Swing, JavaFX & SWT 0
thet1983 Swing JTable mit MySQL Datenbank AWT, Swing, JavaFX & SWT 14
N JTable, AbstractTableModel aus Datenbank initialisieren AWT, Swing, JavaFX & SWT 8
D Applet GWT speichert Daten nicht in Datenbank AWT, Swing, JavaFX & SWT 2
E JList /DefaultListModel mit Datenbank verbinden AWT, Swing, JavaFX & SWT 10
M Datenbank in Jtable mit einem JButton anzeigen lassen AWT, Swing, JavaFX & SWT 4
S Frameübergreifend in Datenbank eingeloggt bleiben AWT, Swing, JavaFX & SWT 9
S Swing JComboBox mit Datenbank füllen AWT, Swing, JavaFX & SWT 16
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
N Formular für Suchanfragen in einer Datenbank AWT, Swing, JavaFX & SWT 3
X Swing Kategoriebaum aus Datenbank erstellen AWT, Swing, JavaFX & SWT 39
J Swing Datenbank in ein Swingfenster importieren? AWT, Swing, JavaFX & SWT 13
K TableModel mit Daten aus Datenbank füllen AWT, Swing, JavaFX & SWT 7
C Combobox im JFrame aus Datenbank befüllen AWT, Swing, JavaFX & SWT 6
C Bild in einer Datenbank speichern? AWT, Swing, JavaFX & SWT 7
S Swing Daten aus Datenbank in JTable AWT, Swing, JavaFX & SWT 2
C Anführungszeichen in JTextArea für Datenbank ersetzen AWT, Swing, JavaFX & SWT 3
B Datensätze einer Datenbank in JTable ausgeben AWT, Swing, JavaFX & SWT 14
O JDialog anzeigen beim öffnen einer Datenbank AWT, Swing, JavaFX & SWT 4
A JList mit 2 Werten aus der Datenbank füttern AWT, Swing, JavaFX & SWT 5
G JTable aus Datenbank füllen AWT, Swing, JavaFX & SWT 4
T Warnkorb + Tabelle + Datenbank AWT, Swing, JavaFX & SWT 3
P JTree aus Datenbank für Kategorien-Realisierung AWT, Swing, JavaFX & SWT 2
P JTable (->Datenbank) editieren/updaten AWT, Swing, JavaFX & SWT 3
R Jtree aus Datenbank akutalisieren AWT, Swing, JavaFX & SWT 9
M Datenbericht aus Datenbank darstellen.(einfaches Konzept) AWT, Swing, JavaFX & SWT 2
A JTable mit MySQL Datenbank füllen AWT, Swing, JavaFX & SWT 12
C [JTable] Update der Datenbank AWT, Swing, JavaFX & SWT 6
U Bild in Datenbank speichern AWT, Swing, JavaFX & SWT 26
T JTable und Datenbank AWT, Swing, JavaFX & SWT 20
W JTextfield aktualisieren / Wert aus Datenbank neu abfragen AWT, Swing, JavaFX & SWT 2
R JTable mit Daten aus der Datenbank füllen AWT, Swing, JavaFX & SWT 3
M Daten aus Datenbank ins JTable einfügen AWT, Swing, JavaFX & SWT 4
G Bild direkt aus Datenbank anzeigen lassen AWT, Swing, JavaFX & SWT 14
M JComboBox aus Datenbank mit 2 Werten füllen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben