Fenster mit Inhalten aus einem Array Füllen

JiXXaW

Mitglied
Hallo zusammen,

zuallererst, ist mein erster Beitrag. Ich hab sowohl Google wie auch die Forensuche bemüht, allerdings dabei nichts brauchbares gefunden aus dem ich schlau geworden bin. Deshalb jetzt der Versuch ein eigenes Thema aufzumachen.


Nun also zum Thema:

ich würde gerne in einem JFrame ein Array wiedergeben. zum üben habe ich mir eine Klasse geschrieben, welche mir abhängig von meiner Auswahl eine Googlesuche zum entsprechenden Begriff durchführt. Diese Klasse würde ich nun gerne in mehreren Schritten implementieren, stoße aber dabei auf eine Reihe von Problemen, bei denen ich ein paar Tipps gebrauchen könnte.

1. Schritt: das allgemeine implementieren eines Fensters, in welchem aus einem Array Informationen gelesen werden und diese dann alle in abhängigkeit von der Arraylänge im Fenster wiedergegeben werden(für die Beispielklasse bedeutet das, dass für jede Position im "names" array ein Label erzeugt werden soll. Hierbei stoße ich auf das Problem, dass ich immer nur das Label der letzten Arrayposition angezeigt bekomme.

Wenn mir jemand sagen könnte wo mein Problem liegt oder mir einen Denkanstoß geben könnte würde mir das vielleicht schon reichen. Ich möchte keinen vorgekauten funktionierenden Code, davon lerne ich vermutlich deutlich weniger als wenn ich selbst nochmal drüber nachdenken muss.


zu den weiteren Schritten bin ich noch nicht gekommen, vermute aber das ich dabei auch noch einige Stolpersteine finden werde 😀.

ganz allgemein, ich lerne seit einem Semester Java, bin also noch nicht superfit. allgemeinte tipps und anmerkungen zum Code sind also gern gesehen.


vielen dank =)


hier einmal die Klasse auf dem aktuellen Stand:

Java:
package google_search;


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





public class SearchFrame extends JFrame
{
    
    String[] names = {"Oscar", "kruemelmonster","graf zahl"};
    String[] ProfilePic = {Pfad zu den Bildern des "names" Arrays};
    String[] Websites = {"Google"};
    String[] WebURLs = {"https://www.google.com/search?q="};
    int counter1 = 0;
    //Label
    
    JLabel jL1 = new JLabel(new ImageIcon(ProfilePic[counter1]));
    JLabel[] jLabels= new JLabel[names.length];
    JLabel jL2 = new JLabel();
    
    //Buttons
    
    private JButton searchTerm = null;

    protected JButton getSearch() {
        if (searchTerm == null) {
            searchTerm = new JButton("Suchen");
            //searchTerm.setVisible(false);
            //searchTerm.setEnabled(false);
            searchTerm.addMouseListener(new Search_MouseAdapter(this));
        }
        return searchTerm;
    }
    
    
    
    
    
    //Comboboxes
    
    private JComboBox<String> WebsiteVis = null;

    public JComboBox<String> getWebsiteVis() {
        if (this.WebsiteVis == null) {
            this.WebsiteVis = new JComboBox<String>(Websites);
            this.WebsiteVis.setSelectedIndex(0);


        }
        return this.WebsiteVis;
    }
    
    
    public SearchFrame(){
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("SearchFrame");
        
        Container myCP = this.getContentPane();
        myCP.setLayout(new GridBagLayout());
        

        
        Insets myI = new Insets(2, 2, 2, 2);
        double weightx = 0;
        double weighty = 0;
        int anchor = GridBagConstraints.WEST;
        int fillNone = GridBagConstraints.BOTH;
        
        //Labels
        
        myCP.add(jL1,
                new GridBagConstraints(1, 0, 2, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));


        //Versuch der Labelerstellung mit einer Schleife

        for (int counterTest =0; counterTest<names.length;counterTest++)
        {
            
            jL2.setText(names[counterTest]);
        myCP.add(jL2,
                new GridBagConstraints(counterTest, 1, 2, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        }
        
        //Comboboxes
        
        myCP.add(getWebsiteVis(),
                new GridBagConstraints(0, 0, 2, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        
        this.pack();
        this.setVisible(true);
        
    }
    
    
}

//Mouseadapter zum öffnen von Google

class Search_MouseAdapter extends MouseAdapter {
    private SearchFrame sf;

    public Search_MouseAdapter(SearchFrame sf) {
        this.sf = sf;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        try {
                
              Desktop desktop = java.awt.Desktop.getDesktop();
              
              URI oURL = new URI(sf.WebURLs[0]+sf.names[0]);
              desktop.browse(oURL);
            } catch (Exception ex) {
              ex.printStackTrace();
            }
    }
}
 
Du musst in der Schleife schon neue Labels erstellen und nicht einfach das aktuelle überschreiben 🙂


danke für die schnelle antwort=). Nach einigem herumprobieren hat das schon mal geklappt.

damit sieht das ganze aktuell so aus:
Java:
package google_search;


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





public class SearchFrame extends JFrame
{
    
    String[] names = {"Oscar", "Graf Zahl","Krümelmonster","Elmo"};
    String[] ProfilePic = {Pfad zu den einzelnen bildern im Bilderordner};
    String[] Websites = {"Google"};
    String[] WebURLs = {"https://www.google.com/search?q="};
    int counter1 = 0;
    //Label
    
    
    
    
    
    //Label Arrays
    JLabel [] jLabels = new JLabel[names.length];
    JLabel [] nameLabels = new JLabel[ProfilePic.length];
    
    
    
    JLabel jL2 = new JLabel();
    
    //Buttons
    
    private JButton searchTerm = null;

    protected JButton getSearch() {
        if (searchTerm == null) {
            searchTerm = new JButton("Suchen");
            //searchTerm.setVisible(false);
            //searchTerm.setEnabled(false);
            searchTerm.addMouseListener(new Search_MouseAdapter(this));
        }
        return searchTerm;
    }
    
    
    
    
    
    //Comboboxes
    
    private JComboBox<String> WebsiteVis = null;

    public JComboBox<String> getWebsiteVis() {
        if (this.WebsiteVis == null) {
            this.WebsiteVis = new JComboBox<String>(Websites);
            this.WebsiteVis.setSelectedIndex(0);


        }
        return this.WebsiteVis;
    }
    
    
    public SearchFrame(){
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("SearchFrame");
        
        Container myCP = this.getContentPane();
        myCP.setLayout(new GridBagLayout());
        

        
        Insets myI = new Insets(2, 2, 2, 2);
        double weightx = 0;
        double weighty = 0;
        int anchor = GridBagConstraints.WEST;
        int fillNone = GridBagConstraints.BOTH;
        
                
        
        //Label im JFrame einfügen
        for (int counterTest =0; counterTest<names.length;counterTest++)
        {
            
        jLabels[counterTest] = new JLabel(names[counterTest]);
        nameLabels[counterTest] = new JLabel(new ImageIcon(ProfilePic[counterTest]));   
            
        myCP.add(jLabels[counterTest],
                new GridBagConstraints(0, counterTest, 1, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        myCP.add(nameLabels[counterTest],
                new GridBagConstraints(1, counterTest, 1, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        }
        
        //Comboboxes
        
        myCP.add(getWebsiteVis(),
                new GridBagConstraints(3, 0, 2, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        
        this.pack();
        this.setVisible(true);
        
    }
    
    
}

class Search_MouseAdapter extends MouseAdapter {
    private SearchFrame sf;

    public Search_MouseAdapter(SearchFrame sf) {
        this.sf = sf;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        try {
                
              Desktop desktop = java.awt.Desktop.getDesktop();
              
              URI oURL = new URI(sf.WebURLs[0]+sf.names[0]);
              desktop.browse(oURL);
            } catch (Exception ex) {
              ex.printStackTrace();
            }
    }
}
 
Hallo nochmal,
in der Zwischenzeit hab ich ein bisschen versucht weiter zu machen, hänge jetzt aber an einer anderen Stelle fest.
anders als beim letzten mal habe ich nun versucht anstelle eines festen Arrays ein Textdokument als Eingabefile zu nutzen:

Java:
package google_search;


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;






public class SearchFrame extends JFrame
{
    //Namensarray erstellen

    public static String readString(String file)
    {
        String text ="";
        try
        {
            Scanner s = new Scanner (new File(file));
            while (s.hasNextLine()){
                text = text +s.next()+" ";
            }
        }
        catch(FileNotFoundException e)
        {
            System.out.println("file not found");
        }
        return text;
    }
    
    public static String[] readArray(String file)
    {
        int ctr =0;
        try
        {
            Scanner s1 = new Scanner(new File(file));
            while (s1.hasNextLine())
            {
                ctr =ctr+1;
                s1.next();
            }
            String[]words = new String[ctr];
            
            Scanner s2 = new Scanner ( new File(file));
            for (int i = 0; i<ctr;i++)
            {
                words[i] = s2.next();
                
            }
            
        }
        catch(FileNotFoundException e)
        {
            
        }
        return null;
        
    }
    
    
    //Ort und Längenabfrage des Bildarrays festlegen
    File ProfilePic = new File("BilderOrdner");
    File[] ProfilePicArray = ProfilePic.listFiles();
    

    
    String[] Websites = {"Google"};
    String[] WebURLs = {"https://www.google.com/search?q="};   



    //Label
    
    
    
    
    
    //Label Arrays
    JLabel [] nameLabels = new JLabel[ProfilePicArray.length];
    JLabel [] picLabels = new JLabel[ProfilePicArray.length];
    
    
    
    JLabel jL2 = new JLabel();
    
    //Buttons
    
    private JButton searchTerm = null;

    protected JButton getSearch() {
        if (searchTerm == null) {
            searchTerm = new JButton("Suchen");
            //searchTerm.setVisible(false);
            //searchTerm.setEnabled(false);
            searchTerm.addMouseListener(new Search_MouseAdapter(this));
        }
        return searchTerm;
    }
    
    
    
    
    
    //Comboboxes
    
    private JComboBox<String> WebsiteVis = null;

    public JComboBox<String> getWebsiteVis() {
        if (this.WebsiteVis == null) {
            this.WebsiteVis = new JComboBox<String>(Websites);
            this.WebsiteVis.setSelectedIndex(0);


        }
        return this.WebsiteVis;
    }
    
    
    public SearchFrame(){
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("SearchFrame");
    
        Container myCP = this.getContentPane();
        myCP.setLayout(new GridBagLayout());
        

        
        
        
        
        Insets myI = new Insets(2, 2, 2, 2);
        double weightx = 0;
        double weighty = 0;
        int anchor = GridBagConstraints.WEST;
        int fillNone = GridBagConstraints.BOTH;

        
        
        //Namen testen
        
        String [] names = readArray("Pfad zum textfile");
        
        for (int i=0; i<names.length;i++)
        {
            System.out.println(names[0]);
        }
        

        

                
        
        //Label im JFrame einfügen
        for (int counterTest =0; counterTest<ProfilePicArray.length;counterTest++)
        {
            
        //Namen
            
                

                    
        //String nameCounter = (names[counterTest]);       
        //nameLabels[counterTest] = new JLabel(names[counterTest]);
        
        
        //Bilder
        String picCounter = String.valueOf(ProfilePicArray[counterTest]);     
        picLabels[counterTest] = new JLabel(new ImageIcon(picCounter));
        
        
            
        //myCP.add(nameLabels[counterTest],
        //        new GridBagConstraints(0, counterTest, 1, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        myCP.add(picLabels[counterTest],
                new GridBagConstraints(1, counterTest, 1, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        
        }
        
        //Comboboxes
        
        myCP.add(getWebsiteVis(),
                new GridBagConstraints(3, 0, 2, 1, weightx, weighty, anchor, fillNone, myI, 0, 0));
        
        this.pack();
        this.setVisible(true);
        //ScreenOut.kPrint(names[0]);


        
        
    }
    
    
}

class Search_MouseAdapter extends MouseAdapter {
    private SearchFrame sf;

    public Search_MouseAdapter(SearchFrame sf) {
        this.sf = sf;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        try {
                
              Desktop desktop = java.awt.Desktop.getDesktop();
              
              //URI oURL = new URI(sf.WebURLs[0]+sf.namesArray[0]);
              //desktop.browse(oURL);
            } catch (Exception ex) {
              ex.printStackTrace();
            }
    }
}

Zum testen wollte ich mir die im textfile eingespeicherten namen ausgeben lassen, bekomme aber genau in dieser zeile eine Nullpointerexception.
Das bedeutet ja meiner meinung nach das etwas in der betroffenen Zeile nicht gefunden wird was in meinem fall vermutlich das Namensarray ist.
warum das allerdings so ist, darauf komme ich irgendwie nicht. Den DatenPfad des Ordners habe ich in der folgenden Struktur angegeben(""C:\\Users\\names.txt")

hätte da vielleicht noch mal jemand einen tipp für mich?=)


vielen dank
 
Mal eine kleine Einführung, in die Geheimnisse des Findens von Fehlern 😉

Fangen wir mal von vorne an: NullPointerException. Das sollte man nämlich schon wissen, worum es da geht.

Eine Variable eines komplexen Datentyps speichert nicht den Wert selbst sondern nur eine Referenz darauf. D. h. wenn Du z. B. eine Variable vom Typ String (oder ein Array) hast, speichert die Variable nicht den String sondern lediglich die Adresse im Speicher (=Referenz), an der sich der String befindet.

Leider ist es möglich, solchen Variablen eine null-Referenz zuzuweisen. null bedeutet so viel wie "kein Objekt". Versuchst Du nun auf ein Objekt zuzugreifen, obwohl keines Vorhanden ist (die betreffende Variable ist null), funktioniert das natürlich nicht, was Dir die Laufzeitumgebung mit einer NullPointerException quittiert.

Das Problem wird bei Dir vermutlich an der Stelle auftreten:
for (int i=0; i<names.length;i++)
Mit dem Wissen von oben ist klar, dass der Grund dafür nur sein kann, dass names == null gilt. Also schaut man nach, wo names gesetzt wird:

String [] names = readArray("Pfad zum textfile");

Ok, names speichert also das Ergebnis eines Methodenaufrufs. Also schauen wir uns die Methode an und stellen fest, dass dort genau ein return vorhanden ist:

Wenn man etwas weiter hoch geht, sieht man, dass nach der zweiten for-Schleife einfach nur words zurückgegeben werden muss: return words;
 

Neue Themen


Zurück
Oben