Array Actionlistener

Jhue89

Bekanntes Mitglied
Hallo Zusammen, da bin ich schon wieder.

ich hab folgende Frage.

ich hab mir über ein Array 10 Comboboxen erstellt. Wie kann ich am besten dafür die Actionlistner erzeugen.

Muss ich für jede Combobox einen eigenen Lister erstellen oder geht das auch gebündelt.
Ich habe schon einiges im Internet nachgelesen aber irgendwie komm ich damit nicht ganz klar.
Es gibt ja die möglichkeit etwas mit getSource zu machen. Das Ist wahrscheinlich genau das was ich brauche, aber ich verstehe nicht wie ich das anlegen muss.

Java:
    cmbSchachtel[0].addActionListener(new ActionListener()
        {
             public void actionPerformed(ActionEvent e)
             {   
                 System.out.println(cmbSchachtel[0].getSelectedItem());
                
             }

cmbSchachtel[1].addActionListener(new ActionListener()
        {
             public void actionPerformed(ActionEvent e)
             {   
                 System.out.println(cmbSchachtel[1].getSelectedItem());
                
             }
        });
 

PinkMuffin

Bekanntes Mitglied
Ich nehme mal an, du hast mit einer Schleife einen Array mit Comboboxen gefüllt? In dieser Schleife kannst du auch einen Actionlistener adden.
 

Jhue89

Bekanntes Mitglied
Ich nehme mal an, du hast mit einer Schleife einen Array mit Comboboxen gefüllt? In dieser Schleife kannst du auch einen Actionlistener adden.
Ok , das würde dann so aussehen?

Java:
//Btn Aktion combobox hinzufügen
if (i< lblSchachtel.length-1)
{                                           
mbSchachtel[i]= new JComboBox<String>(Daten);
cmbSchachtel[i].addActionListener(new ActionListener()
        {
             public void actionPerformed(ActionEvent e)
             {   
                 System.out.println(cmbSchachtel[i].getSelectedItem());
                
             }
        }
i++;
}
 

PinkMuffin

Bekanntes Mitglied
Ob dieser Teil
Java:
System.out.println(cmbSchachtel[i].getSelectedItem());
so funktionieren wird, kann ich nicht sagen, ich hab mich noch nicht genau mit Comboboxen auseinandergesetzt, aber vom Verständnis her müsste es funktionieren. Probier es doch mal aus, das Adden geht auf jeden Fall so.
 

Jhue89

Bekanntes Mitglied
Ob dieser Teil
Java:
System.out.println(cmbSchachtel[i].getSelectedItem());
so funktionieren wird, kann ich nicht sagen, ich hab mich noch nicht genau mit Comboboxen auseinandergesetzt, aber vom Verständnis her müsste es funktionieren. Probier es doch mal aus, das Adden geht auf jeden Fall so.
ich hab das jetzt mal ausprobiert, leider führ das nicht zum gewünschten Ergebnis. Wenn ich den Listner mit in die Schleife packe, wird der doch nur aufgerufen wenn ich die "btn hinzufügen" Aktion ausführe oder?
 
K

kneitzel

Gast
ich hab das jetzt mal ausprobiert, leider führ das nicht zum gewünschten Ergebnis. Wenn ich den Listner mit in die Schleife packe, wird der doch nur aufgerufen wenn ich die "btn hinzufügen" Aktion ausführe oder?
Also was genau hast Du wir probiert? Und was genau ist das Ergebnis?

Generell wird beim Ausführen der Schleife auch die jeweilige Instanz von ActionListener erzeugt und damit steht das dann zur Verfügung.

Aber dein Code ist noch nicht wirklich nachvollziehbar - die Abläufe, wann Du was wie initialisierst sind mir derzeit nicht klar und das ganze Design sieht recht unglücklich aus.

Ich bin immer ein Fan von sauberem Design. Pack das zusammen, was zusammen gehört. Wenn also das, was Du in mbSchachtel und in cmbSchachtel hast, zusammen gehört, dann lass das auch irgendwie zusammen. Du kannst da objektorientiert gewisse Dinge bauen (dann hast Du da auch ein spezielles Verhalten und so... oder du kannst wenigstens die Daten so halten, dass Du gut darauf zugreifen kannst. Das könnte zur Not sogar eine einfache Map<Component,Component> sein. Dann würdest Du da halt die entsprechenden Paar hinzu fügen und könntest dann im ActionListener einfach darauf zu greifen.
Aber ich halte es für besser, das entsprechend objektorientiert anzugehen. Dann hast Du da eine "Schachtel" (Das war ja in den Variablen gleich) und da hast Du dann ein gewisses Verhalten. Incl. dem ActionListener, der dann mit dem anderen Control etwas macht...

Und um den Code lesbarer / kürzer zu gestalten, wäre mein Vorschlag auch, einmal Richtung Lambda oder Methodenreferenzen zu gehen um dieses new ActionListener() { ... } los zu werden ... Dazu muss man nicht tief einsteigen und hat schnell deutlich besseren Code (meiner Meinung nach).
 

Jhue89

Bekanntes Mitglied
Also was genau hast Du wir probiert? Und was genau ist das Ergebnis?

Generell wird beim Ausführen der Schleife auch die jeweilige Instanz von ActionListener erzeugt und damit steht das dann zur Verfügung.

Aber dein Code ist noch nicht wirklich nachvollziehbar - die Abläufe, wann Du was wie initialisierst sind mir derzeit nicht klar und das ganze Design sieht recht unglücklich aus.

Ich bin immer ein Fan von sauberem Design. Pack das zusammen, was zusammen gehört. Wenn also das, was Du in mbSchachtel und in cmbSchachtel hast, zusammen gehört, dann lass das auch irgendwie zusammen. Du kannst da objektorientiert gewisse Dinge bauen (dann hast Du da auch ein spezielles Verhalten und so... oder du kannst wenigstens die Daten so halten, dass Du gut darauf zugreifen kannst. Das könnte zur Not sogar eine einfache Map<Component,Component> sein. Dann würdest Du da halt die entsprechenden Paar hinzu fügen und könntest dann im ActionListener einfach darauf zu greifen.
Aber ich halte es für besser, das entsprechend objektorientiert anzugehen. Dann hast Du da eine "Schachtel" (Das war ja in den Variablen gleich) und da hast Du dann ein gewisses Verhalten. Incl. dem ActionListener, der dann mit dem anderen Control etwas macht...

Und um den Code lesbarer / kürzer zu gestalten, wäre mein Vorschlag auch, einmal Richtung Lambda oder Methodenreferenzen zu gehen um dieses new ActionListener() { ... } los zu werden ... Dazu muss man nicht tief einsteigen und hat schnell deutlich besseren Code (meiner Meinung nach).
Sauberes design finde ich Gut. wenn der Code nicht nachvollziehbar ist kann ich nätulich den ganzen Code reinstellen. Für Verbesserungen bin ich natürlich immer offen.
Java:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JMenuBar;
import javax.swing.JButton;
import javax.swing.JFileChooser;

import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.awt.Font;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JComboBox;
import javax.swing.Icon;
import javax.swing.ImageIcon;

public class MainWindow extends JFrame implements ActionListener{
    private JButton             btnSchachtelLaden;
    private JLabel                 lblSchachtel[] = new JLabel[10];
    private JComboBox<String>[]            cmbSchachtel = new JComboBox[10];
    private JButton             btnSchachtelHinzufügen;
    private String                 path;
    private String[]             BoxcardName;
    //private ArrayList<String>    SchachtelListe = new ArrayList<String>();
    private Boolean                ShowUUID = false;   
    
    
    //Variablen Deklartion
    private int Schachtelanzahl = 1;
    
    public MainWindow() {
        
        
        
        // Eigenschaften Hauptfenster
        setVisible(true);
        setTitle("Test Programm");
        setSize(1500, 900);
        setLocationRelativeTo(null);
        System.out.println("Programm wurde gestartet");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);
        
        btnSchachtelHinzufügen = new JButton("Schachtel hinzufügen");   
        btnSchachtelHinzufügen.setBounds(24, 120 , 400, 30);
        getContentPane().add(btnSchachtelHinzufügen);
        
        btnSchachtelLaden = new JButton("Datei laden");
        btnSchachtelLaden.setBounds(24, 11, 171, 36);
        getContentPane().add(btnSchachtelLaden);
        
        lblSchachtel[0] = new JLabel("Schachtel Teil 1");       
        lblSchachtel[0].setBounds(24, 45, 646, 30);
        getContentPane().add(lblSchachtel[0]);
        
        lblSchachtel[1] = new JLabel("Schachtel Teil 2");
        lblSchachtel[2] = new JLabel("Schachtel Teil 3");
        lblSchachtel[3] = new JLabel("Schachtel Teil 4");
        lblSchachtel[4] = new JLabel("Schachtel Teil 5");
        lblSchachtel[5] = new JLabel("Schachtel Teil 6");
        lblSchachtel[6] = new JLabel("Schachtel Teil 7");
        lblSchachtel[7] = new JLabel("Schachtel Teil 8");
        lblSchachtel[8] = new JLabel("Schachtel Teil 9");
        lblSchachtel[9] = new JLabel("Schachtel Teil 10");
        
        
        cmbSchachtel[0] = new JComboBox<String>();
        cmbSchachtel[0].setBounds(24, 73, 477, 36);
        cmbSchachtel[0].addItem("Kein Verzeichnis ausgewählt");
        
        cmbSchachtel[1]= new JComboBox<String>();
        cmbSchachtel[2]= new JComboBox<String>();
        cmbSchachtel[3]= new JComboBox<String>();
        cmbSchachtel[4]= new JComboBox<String>();
        cmbSchachtel[5]= new JComboBox<String>();
        cmbSchachtel[6]= new JComboBox<String>();
        cmbSchachtel[7]= new JComboBox<String>();
        cmbSchachtel[8]= new JComboBox<String>();
        cmbSchachtel[9]= new JComboBox<String>();       
                
        
        getContentPane().add(cmbSchachtel[0]);
        getContentPane().validate();
        getContentPane().repaint();
        
        
            
//************************************Actions******************************************   
        cmbSchachtel[0].addActionListener(this);
        
            
        btnSchachtelHinzufügen.addActionListener(new ActionListener()
        {             
             public void actionPerformed(ActionEvent e1)
             {   
                if (Schachtelanzahl < lblSchachtel.length-1)
                {                                               
                    lblSchachtel[Schachtelanzahl].setVisible(true);               
                    lblSchachtel[Schachtelanzahl].setBounds(24, (45 + (Schachtelanzahl)*60), (646 ) , 30);
                    getContentPane().add(lblSchachtel[Schachtelanzahl]);
                    
                    try //Fehlerabfangen wenn noch keine Datei geladen wurde
                    {
                        BoxcardName = Schachteleinlesen( BoxcardName, path, ".boxcard", cmbSchachtel[Schachtelanzahl], ShowUUID);
                        
                    }
                    catch (Exception e4)
                    {
                        
                        cmbSchachtel[Schachtelanzahl].addItem("Kein Verzeichnis ausgewählt");
                    }
                    cmbSchachtel[Schachtelanzahl].setBounds(24, (73 + (Schachtelanzahl )*60), 477, 36);
                    cmbSchachtel[Schachtelanzahl].addActionListener(this);
                    
                    cmbSchachtel[Schachtelanzahl].addActionListener(new ActionListener()
                    {
                         public void actionPerformed(ActionEvent e)
                         {   
                             System.out.println(cmbSchachtel[Schachtelanzahl].getSelectedItem());
                            
                         }
                    });     
                    getContentPane().add(cmbSchachtel[Schachtelanzahl]);
                    btnSchachtelHinzufügen.setLocation(24, (120 +(Schachtelanzahl)*60));
                    
                    //frame neu generieren
                    getContentPane().validate();
                    getContentPane().repaint();
                            
                    Schachtelanzahl++;
                    if(Schachtelanzahl == lblSchachtel.length-1)
                    {
                        btnSchachtelHinzufügen.setEnabled(false);   
                    }   
                }
                
             }       
        });       
        
        
        btnSchachtelLaden.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e2)
            {
                // Dateiverzeichnis auswählen
                
                JFileChooser Filesys= new JFileChooser(new File("Z:\\boxdb_test\\boxpara\\"));
                Filesys.setMultiSelectionEnabled(true);                   
                Filesys.setDialogTitle("Verzeichnis Laden");
                System.out.println("Geöffnet");
                Filesys.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY );
                int returnVal = Filesys.showOpenDialog(null);
                
                //Beginn Fehlerabfrage
                if (returnVal == JFileChooser.APPROVE_OPTION)
                {                   
                    File[] file = Filesys.getSelectedFiles();
                    
                    // Build array   
                    
                    System.out.println(file.length);
                    path = file[0].getPath();
                    deletArray(BoxcardName);
                    System.out.println(path);
                    
                    for(int i = 0; i < Schachtelanzahl; i++)
                    {
                        cmbSchachtel[i].removeAllItems();
                        BoxcardName = Schachteleinlesen( BoxcardName, path, ".boxcard", cmbSchachtel[i], ShowUUID);
                    }
                    System.out.println( BoxcardName[81]);
                    System.out.println("Dialog geöffnet");           
                }
                else if (returnVal == JFileChooser.CANCEL_OPTION){}                 
                else if (returnVal == JFileChooser.ERROR_OPTION) {}
            }
        });   
    }
    
//********************************* Methoden*******************************************************
    
    
    // Array löschen
    public static void deletArray (String del[])
    {
        try {
        
            for(int i = 0; i < del.length; i++)
            del[i]= null;
        }
        catch(Exception e)
        {
            System.out.println("leer");
        }
    }   
    
    // Schachtel einlesen
    public String[] Schachteleinlesen (String Array[], String path, String Filter, JComboBox<String> cmb, Boolean UUID)
    {
    
    File f = new File(path);
    File[] l = f.listFiles();
    Array= new String[l.length+1];
    
     int y = 1;
        Array[0] = "keine Schachtel ausgewählt";
        cmb.addItem(Array[0]);
        
        for (int i = 1; i < l.length; i++)
        {
            if (l[i].getName().contains(Filter))
            {   
                if (UUID == true)
                {               
                    Array[y] = l[i].getName();
                    System.out.println(Array[y]);
                    cmb.addItem(Array[y]);
                     y++;
                }
                else
                {
                    Array[y] = l[i].getName();
                    Array[y]=zerschnippel(Array[y], ".");   
                    cmb.addItem(Array[y]);
                    y++;
                }
            }
        }
       return Array;
    }
    
    public String zerschnippel(String param, String lookAt)
    {
     return param.substring(0,param.indexOf(lookAt));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getSource());
        if(e.getSource() == this.cmbSchachtel[0]){
            System.out.println("geht doch");           
        }
        else if(e.getSource() == this.cmbSchachtel[1]){
            System.out.println("geht doch1");
      
    }
    }
}
 
K

kneitzel

Gast
Also dann habe ich einfach mal Deinen Code kopiert und mal ein paar Änderungen vorgenommen:

a) Ich habe mal eine main Methode hinzugefügt mit einem einfachen new MainWindow()
Das aber nur zur Erläuterung - Du wirst das in einer anderen Klasse haben, was gut ist!

b) setVisible kommt ans Ende des Konstuktors - damit kann das validate und repaint weg. (Also immer erst am Ende sichtbar machen!)

c) implements ActionListener weg. actionPerformed kann dann umbenannt werden - aber keine Ahnung in was, den was macht die? testOutputAction habe ich mal genommen ... und dann da, wo this als ActionListener eingetragen war dann this::testOutputAction eingetragen (Methodenreferenz)

d) den new ActionListener bei btnSchachtelHinzufügen.addActionListener in eigene Methode gepackt: schachtelHinzufuegenAction und dann die Methoden-Referenz hinzugefügt.

e) Die Blöcke, die mehrere Controls erstellen, zu einer Schleife umgestellt.

f) Exception handling! Das ist absolut fahrlässig:
Java:
        } catch (Exception e) {
            System.out.println("leer");
        }

Und was für eine Exception möchtest Du in dem Code fangen?
Java:
            for (int i = 0; i < del.length; i++)
                del[i] = null;
Wenn Du abfangen willst, dass del null ist, dann könnte (sollte) man das mit einem if machen.

e) Paar kleine Refactorings: Methoden fangen mit einem kleinen Buchstaben an, camelCase ...

Das waren nur ein paar kleine Aufwärm-Übungen. Nun kommen wir zu dem letzten ActionHandler - dem mit dem
System.out.println(cmbSchachtel[Schachtelanzahl].getSelectedItem());

Da willst Du das ausgewählte Element von dem Control haben, das diese Auswahl getriggert hat. Das Element ist ja im Parameter mit vorhanden. Daher geht sowas:
Java:
    public void printSelectedItem(ActionEvent e) {
        if (e.getSource() instanceof JComboBox) {
            JComboBox<String> comboBox = (JComboBox) e.getSource();
            System.out.println(comboBox.getSelectedItem());
        }
    }

f) boxcardName Array: Da Du ja ein neues Array erstellst musst Du das nicht erst leer machen. Und Du musst es auch nicht als Parameter übergeben ... Und das System.out.println(boxcardName[81]); führt natürlich auch schnell zu einem IndexOutOfBounds ...

Mit diesen Änderungen hat sich der Code etwas gewandelt (Ohne das Design jetzt wirklich anzupassen - das waren nur kleine Anpassungen des Codes....)
Java:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.File;

public class MainWindow extends JFrame {
    private final JButton btnSchachtelLaden;
    private final JLabel[] lblSchachtel = new JLabel[10];
    private final JComboBox<String>[] cmbSchachtel = new JComboBox[10];
    private final JButton btnSchachtelHinzufügen;
    private String path;
    private String[] boxcardName;
    private final Boolean showUUID = false;


    private int Schachtelanzahl = 1;

    public static void main(String[] args) {
        new MainWindow();
    }

    public MainWindow() {
        setTitle("Test Programm");
        setSize(1500, 900);
        setLocationRelativeTo(null);
        System.out.println("Programm wurde gestartet");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        btnSchachtelHinzufügen = new JButton("Schachtel hinzufügen");
        btnSchachtelHinzufügen.setBounds(24, 120, 400, 30);
        getContentPane().add(btnSchachtelHinzufügen);

        btnSchachtelLaden = new JButton("Datei laden");
        btnSchachtelLaden.setBounds(24, 11, 171, 36);
        getContentPane().add(btnSchachtelLaden);

        lblSchachtel[0] = new JLabel("Schachtel Teil 1");
        lblSchachtel[0].setBounds(24, 45, 646, 30);
        getContentPane().add(lblSchachtel[0]);

        for (int i = 1; i<=9; i++) {
            lblSchachtel[i] = new JLabel("Schachtel Teil " + (i+1));
            cmbSchachtel[i] = new JComboBox<String>();

        }

        cmbSchachtel[0] = new JComboBox<String>();
        cmbSchachtel[0].setBounds(24, 73, 477, 36);
        cmbSchachtel[0].addItem("Kein Verzeichnis ausgewählt");

        getContentPane().add(cmbSchachtel[0]);

        cmbSchachtel[0].addActionListener(this::testOutputAction);
        btnSchachtelHinzufügen.addActionListener(this::schachtelHinzufuegenAction);
        btnSchachtelLaden.addActionListener(this::schachtelLadenAction);
        setVisible(true);
    }

    public static void deleteArray(String[] del) {
        for (int i = 0; i < del.length; i++)
            del[i] = null;
    }

    public String[] schachtelEinlesen(String path, String filter, JComboBox<String> cmb, Boolean uuid) {

        File f = new File(path);
        File[] l = f.listFiles();
        String[] array = new String[l.length + 1];

        int y = 1;
        array[0] = "keine Schachtel ausgewählt";
        cmb.addItem(array[0]);

        for (int i = 1; i < l.length; i++) {
            if (l[i].getName().contains(filter)) {
                if (uuid == true) {
                    array[y] = l[i].getName();
                    System.out.println(array[y]);
                    cmb.addItem(array[y]);
                    y++;
                } else {
                    array[y] = l[i].getName();
                    array[y] = zerschnippel(array[y], ".");
                    cmb.addItem(array[y]);
                    y++;
                }
            }
        }
        return array;
    }

    public String zerschnippel(String param, String lookAt) {
        return param.substring(0, param.indexOf(lookAt));
    }

    public void testOutputAction(ActionEvent e) {
        System.out.println(e.getSource());
        if (e.getSource() == this.cmbSchachtel[0]) {
            System.out.println("geht doch");
        } else if (e.getSource() == this.cmbSchachtel[1]) {
            System.out.println("geht doch1");

        }
    }

    public void schachtelHinzufuegenAction(ActionEvent e1) {
        if (Schachtelanzahl < lblSchachtel.length - 1) {
            lblSchachtel[Schachtelanzahl].setVisible(true);
            lblSchachtel[Schachtelanzahl].setBounds(24, (45 + (Schachtelanzahl) * 60), (646), 30);
            getContentPane().add(lblSchachtel[Schachtelanzahl]);

            try //Fehlerabfangen wenn noch keine Datei geladen wurde
            {
                boxcardName = schachtelEinlesen(boxcardName, path, ".boxcard", cmbSchachtel[Schachtelanzahl], showUUID);
            } catch (Exception e4) {
                cmbSchachtel[Schachtelanzahl].addItem("Kein Verzeichnis ausgewählt");
            }
            cmbSchachtel[Schachtelanzahl].setBounds(24, (73 + (Schachtelanzahl) * 60), 477, 36);
            cmbSchachtel[Schachtelanzahl].addActionListener(this::testOutputAction);
            cmbSchachtel[Schachtelanzahl].addActionListener(this::printSelectedItem);
            getContentPane().add(cmbSchachtel[Schachtelanzahl]);
            btnSchachtelHinzufügen.setLocation(24, (120 + (Schachtelanzahl) * 60));

            //frame neu generieren
            getContentPane().validate();
            getContentPane().repaint();

            Schachtelanzahl++;
            if (Schachtelanzahl == lblSchachtel.length - 1) {
                btnSchachtelHinzufügen.setEnabled(false);
            }
        }
    }

    public void schachtelLadenAction(ActionEvent e2) {
        // Dateiverzeichnis auswählen

        JFileChooser Filesys = new JFileChooser(new File("Z:\\boxdb_test\\boxpara\\"));
        Filesys.setMultiSelectionEnabled(true);
        Filesys.setDialogTitle("Verzeichnis Laden");
        System.out.println("Geöffnet");
        Filesys.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = Filesys.showOpenDialog(null);

        //Beginn Fehlerabfrage
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File[] file = Filesys.getSelectedFiles();

            // Build array

            System.out.println(file.length);
            path = file[0].getPath();
            System.out.println(path);

            for (int i = 0; i < Schachtelanzahl; i++) {
                cmbSchachtel[i].removeAllItems();
                boxcardName = schachtelEinlesen(path, ".boxcard", cmbSchachtel[i], showUUID);
            }
//            System.out.println(boxcardName[81]);
            System.out.println("Dialog geöffnet");
        } else if (returnVal == JFileChooser.CANCEL_OPTION) {
        } else if (returnVal == JFileChooser.ERROR_OPTION) {
        }
    }

    public void printSelectedItem(ActionEvent e) {
        if (e.getSource() instanceof JComboBox) {
            JComboBox<String> comboBox = (JComboBox) e.getSource();
            System.out.println(comboBox.getSelectedItem());
        }
    }
}

Das aber einfach nur um ein paar Kleinigkeiten zu zeigen in der Hoffnung, dass es etwas hilft. Mir ist bewusst, dass dieses kurze "Friß oder stirb" mit fertigen Anpassungen hinwerfen nicht wirklich tauglich ist. Aber die kurzen Anmerkungen reichen hoffentlich, um dann mehr Erläuterung im Netz zu finden. Ansonsten einfach mal nachfragen, wir erläutern dann noch etwas mehr ...
 

Jhue89

Bekanntes Mitglied
a) Ich habe mal eine main Methode hinzugefügt mit einem einfachen new MainWindow()
Das aber nur zur Erläuterung - Du wirst das in einer anderen Klasse haben, was gut ist!

b) setVisible kommt ans Ende des Konstuktors - damit kann das validate und repaint weg. (Also immer erst am Ende sichtbar machen!)
Das macht Sinn, ich hatte Probleme mit der Darstellung nachdem ein Button hinzugefügt worden ist.


c) implements ActionListener weg. actionPerformed kann dann umbenannt werden - aber keine Ahnung in was, den was macht die? testOutputAction habe ich mal genommen ... und dann da, wo this als ActionListener eingetragen war dann this::testOutputAction eingetragen (Methodenreferenz)
Das ist erstmal nur das Grundgerüst, wenn ich weiss welcher Eintrag ausgewählt wurde will ich Daten aus einem Json file laden. (Das wird die nächste Baustelle). Die Geschichte mit der Methodenreferenz ist mir noch nicht ganz klar.

d) den new ActionListener bei btnSchachtelHinzufügen.addActionListener in eigene Methode gepackt: schachtelHinzufuegenAction und dann die Methoden-Referenz hinzugefügt.

e) Die Blöcke, die mehrere Controls erstellen, zu einer Schleife umgestellt.
Ja, da wollte ich auch eine Schleife raus machen. Ich hatte die erzeugung zuerst in der Action Button hinzufügen das funktionierte auch soweit, aber dann kamm das Problem mit dem Listner. Aber ich glaube die Erzeugung am Anfang zu machen ist deutlich übersichtlicher.

f) Exception handling! Das ist absolut fahrlässig:
Mir ist nicht ganz klar warum das Fahrlässig ist. Ich möchte damit einen null eintrag verhinden. Ich dachte dafür ist die Try catch bedingung.

e) Paar kleine Refactorings: Methoden fangen mit einem kleinen Buchstaben an, camelCase ...
Ja, da war mal was in der Schule...

Die Instanceof Geschichte sieht gut aus und ist gut verständlich.

f) boxcardName Array: Da Du ja ein neues Array erstellst musst Du das nicht erst leer machen. Und Du musst es auch nicht als Parameter übergeben ... Und das System.out.println(boxcardName[81]); führt natürlich auch schnell zu einem IndexOutOfBounds ...

Meinst du diese Teil?
Java:
for (int i = 0; i < Schachtelanzahl; i++) {
                cmbSchachtel[i].removeAllItems();
                boxcardName = schachtelEinlesen(path, ".boxcard", cmbSchachtel[i], showUUID);
            }

Theortisch muss ich nur einmal ein Verzeichnis auswählen. das mach ich wahscheinlich auch noch anders.
Ich hatte mir das so gedacht, wenn ich später nochmal das verzeichnis ändere lösche ich alle Daten für die Comboboxen und schreibe anschließend die neuen einträge.



Nocheinmal einen Großes Dankeschön für die Hinweise. Ich glaube da hilft echt weiter. Die große frage ist ja immer wie komme ich sauber und geschickt zum Ziel. Leider fehlt mir noch eine Menge Syntax. Aber das wird bestimmt mit der Zeit besser.
 
K

kneitzel

Gast
f) Exception handling! Das ist absolut fahrlässig:
Mir ist nicht ganz klar warum das Fahrlässig ist. Ich möchte damit einen null eintrag verhinden. Ich dachte dafür ist die Try catch bedingung.
Wenn Dein Programm in ein Problem rennt, dann möchtest Du doch dieses Problem abstellen können. Daher solltest Du dafür sorgen, dass Du immer die Informationen bekommst, die Du benötigst.
Bei Exceptions sind aber zwei Dinge zu unterscheiden:
a) Zur Laufzeit passiert etwas unerwartetes - Das ist blöd und da muss man dann irgendwie reagieren oder das Problem nur an den Anwender kommunizieren, damit dieser es abstellen kann. ==> Dafür ist das catch da!
b) Der Entwickler macht etwas falsch. Die NPE (NullPointerException) ist das beste Beispiel dafür. Hier willst Du nicht die Exception abfangen sondern Du willst dein Programm umschreiben, so dass der Fehler nicht mehr vorhanden ist.

Da kann dann z.B. ein einfaches if (whatever == null) als Check ausreichend sein. Bei der deleteArray Methode könnte man einfach zurück gehen also ein return in dem Fall machen. Oder man gibt vor, dass es nicht null sein darf - dann wirft man eine Exception und Du musst beim Aufruf deinen Code anpassen!

Das fahrlässige kommt aber aus 2 Gründen:
- Du fängst alle Exceptions - wer weiß, was da mit der Zeit hinterher noch im try Block alles gemacht wird ...
- Du gibst wichtige Daten nicht aus. Du bekommst also nicht mit, dass es eine Exception gab und kannst daher Fehler nicht beheben.

Wenn Du so Exceptions fängst, dann immer ausgeben. Also immer etwas wie:
Java:
catch (WhateverException ex) {
    System.err.println("Exception when doing something: " + ex.getMessage());
    ex.printStackTrace(System.err);
}
Und wenn Du da NPE siehst, dann immer schauen: Wo wurde diese ausgelöst? Und was muss im Programm angepasst werden, um damit umgehen zu können...

Die große frage ist ja immer wie komme ich sauber und geschickt zum Ziel. Leider fehlt mir noch eine Menge Syntax. Aber das wird bestimmt mit der Zeit besser.
Einfach weiter probieren und versuchen Praxis zu bekommen. Ideal ist immer ein Mentor/Tutor, der einen unterstützt, aber wenn Du regelmäßig hier im Forum bist mit Code, dann kommen viele Hinweise auch so.

Da vielleicht auch noch zur Einordnung: Das sind Hinweise, die helfen sollen. Und bei Code verwende ich gerne deutliche Worte, wie "fahrlässig" und so. Das richtet sich aber nicht gegen Dich - Du bist dabei etwas zu lernen und das ist super und da kann so ein Code eine gute Leistung sein! Daher auf keinen Fall entmutigen lassen - die Hinweise sollen nur helfen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V ActionListener mit Array Java Basics - Anfänger-Themen 2
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
L Frage zum Array Java Basics - Anfänger-Themen 1
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
Lion.King Array deklarieren und initialisieren Java Basics - Anfänger-Themen 5
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
A Elemente in einem Array Java Basics - Anfänger-Themen 5
A Vorkommende Farben ermittel und als Array zurückgeben Java Basics - Anfänger-Themen 7
AhmadSlack Array Java Basics - Anfänger-Themen 7
Jambolo Kartenhand Array Java Basics - Anfänger-Themen 14
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
EykS 3D Druckdatei basierend auf 3D Array? Java Basics - Anfänger-Themen 3
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
Chris.089 2 Werte im Array tauschen Java Basics - Anfänger-Themen 6
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
L Gridmuster in einem Array Java Basics - Anfänger-Themen 2
sgtcoopa Array übergeben Schleife Java Basics - Anfänger-Themen 0
B Compiler-Fehler Array aus Objekten übergeben Java Basics - Anfänger-Themen 7
padde479 Array Multiplikation der ersten n Zahlen Java Basics - Anfänger-Themen 7
G zweidimensionales int Array sortieren Java Basics - Anfänger-Themen 57

Ähnliche Java Themen

Neue Themen


Oben