Liste mittels SwingWorker füllen klappt nicht

Maxi92

Aktives Mitglied
hi leute!

Ich hab folgendes Problem.
Ich möchte in eine Liste die attribute meines Objekts schreiben...stattdessen wird aber immer nur die Adresse geschrieben...

vielleicht kann sich mal jemand meinen Code anschauen und mir sagen warum es nicht funktioniert...

Die Klasse mit dem SwingWorker

Java:
public class ManuellGUI extends javax.swing.JFrame
{       
    private Kanonen model = new Kanonen();
    private StringZerlegung sz = new StringZerlegung();

    public int[] durchmesser = new int[10];
    private int[] aktiveKanonen = new int[10];
    private String[][] feld = new String[20][10];
    private JTextField[] tfDurchmesser = new JTextField[10];
    private JPanel[] paKanonen = new JPanel[10];
    private JCheckBox[] cbSchiessen = new JCheckBox[10];
    private JButton[] btFiren = new JButton[10];


    /** Creates new form ManuellGUI */
    public ManuellGUI()
    {
        initComponents();   
        liListe.setModel(model);
        model.add(new Kanone(23,23,23)); // Testdaten werden aber auch nur als Adresse angezeigt
        super.setLocationRelativeTo(null);

        // Initialisierung des Textfeld-Arrays
        tfDurchmesser[0] = tfØKM1;
        tfDurchmesser[1] = tfØKM2;
        tfDurchmesser[2] = tfØKM3;
        tfDurchmesser[3] = tfØKM4;
        tfDurchmesser[4] = tfØKM5;
        tfDurchmesser[5] = tfØKM6;
        tfDurchmesser[6] = tfØKM7;
        tfDurchmesser[7] = tfØKM8;
        tfDurchmesser[8] = tfØKM9;
        tfDurchmesser[9] = tfØKM10;

        // Initialisierung des Panel-Arrays
        paKanonen[0] = paKanoneMan1;
        paKanonen[1] = paKanoneMan2;
        paKanonen[2] = paKanoneMan3;
        paKanonen[3] = paKanoneMan4;
        paKanonen[4] = paKanoneMan5;
        paKanonen[5] = paKanoneMan6;
        paKanonen[6] = paKanoneMan7;
        paKanonen[7] = paKanoneMan8;
        paKanonen[8] = paKanoneMan9;
        paKanonen[9] = paKanoneMan10;

        // Initialisierung des CheckBox-Arrays
        cbSchiessen[0] = cbØKM1;
        cbSchiessen[1] = cbØKM2;
        cbSchiessen[2] = cbØKM3;
        cbSchiessen[3] = cbØKM4;
        cbSchiessen[4] = cbØKM5;
        cbSchiessen[5] = cbØKM6;
        cbSchiessen[6] = cbØKM7;
        cbSchiessen[7] = cbØKM8;
        cbSchiessen[8] = cbØKM9;
        cbSchiessen[9] = cbØKM10;

        // Initialisierung des Button-Arrays
        btFiren[0] = btFire1;
        btFiren[1] = btFire2;
        btFiren[2] = btFire3;
        btFiren[3] = btFire4;
        btFiren[4] = btFire5;
        btFiren[5] = btFire6;
        btFiren[6] = btFire7;
        btFiren[7] = btFire8;
        btFiren[8] = btFire9;
        btFiren[9] = btFire10;

        // ShortCut '1' für den Button Feuern1
        btFire1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("1"), "fire1");
        btFire1.getActionMap().put("fire1", new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                onFire1(e);
            }
        });

    public void setAktiveKanonen(int[] aktiveKanonen)
    {
        this.aktiveKanonen = aktiveKanonen;

        // Sperren der Kanonen die nicht aktiviert worden
        for(int i = 0; i < paKanonen.length; i++)
        {
            if(aktiveKanonen[i] == 0)
            {
                btFiren[i].setEnabled(false);
                cbSchiessen[i].setEnabled(false);
            }
        }
    }

    public void setTextFelder(int[] durchmesser)
    {
        for (int i = 0; i < durchmesser.length; i++)
        {
            if(durchmesser[i] != 0)
            {
                // Konsolenausgabe zu Testzwecken
                System.out.println("setTextFelder d"+ (i+1) + ": " + durchmesser[i]);

                // Setzen der Durchmesser
                tfDurchmesser[i].setText("" + durchmesser[i]);
            }
            else
                tfDurchmesser[i].setText("deaktiviert");
        }
        System.out.println();
    }

    private void onSwingWorker(java.awt.event.ActionEvent evt)                               
    {                                   
        MySwingWorker worker;

        try
        {
            slFertig.setValue(0);
            worker = new MySwingWorker();

            worker.addPropertyChangeListener
            (
                new PropertyChangeListener()
                {
                    public void propertyChange(PropertyChangeEvent evt)
                    {
                        if ("progress".equals(evt.getPropertyName()))
                        {
                            slFertig.setValue((Integer)evt.getNewValue());
                        }
                    }
                }
            );
            worker.execute();
        }
        catch (Exception e)
        {
            tfVKM4.setText("Fehler: "+e.getMessage());
        }
    }                              

    private class MySwingWorker
            extends SwingWorker<Object, Kanone>
    {
        public double speed;

        public MySwingWorker()
                throws Exception
        {
            tfVKM4.setText("Worker start...");
            Scanner scanner = new Scanner(tfVKM5.getText());
            speed = scanner.nextDouble();
        }

        /**
        * Schreibt einen Text in das Textfeld tfStatus
        * mit Hilfe der SwingUtilities, damit die Methode setText()
        nur
        * innerhalb der Swing-Threads aufgerufen wird.
        * @param text1
        */
        private void setText(final String text1)
        {
            SwingUtilities.invokeLater
            (
                new Runnable()
                {
                    public void run()
                    {
                        tfVKM4.setText(text1);
                    }
                }
            );
        }

        @Override
        protected Object doInBackground()
                throws Exception
        {
            for(int i=0; i<10; i++)
            {
                Thread.sleep(1000);
                Kanone kan = new Kanone(23,speed,23.23);
                setText("doInBackground");
                setProgress(10*(i+1)); // aktiviert propertyChange
                Thread.sleep(1000);
                publish(kan);
            }
            return null;
        }

        @Override
        protected void done() // wird automatisch aufgerufen
        {
//            super.done();
            tfVKM4.setText("Worker fertig");
//            Object object = get();
            // holt Ergebnis von doInBackground
        }

        @Override
        protected void process(List<Kanone> chunks)
        {
            for(Kanone kan:chunks)
            {
                model.add(kan);
            }
            tfVKM4.setText("Worker arbeitet");
        }
    }

   /**
     * @param args the command line arguments
     */
    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new ManuellGUI().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton btAlleSchiessen;
    private javax.swing.JButton btFire1;
    private javax.swing.JButton btFire10;
    private javax.swing.JButton btFire2;
    private javax.swing.JButton btFire3;
    private javax.swing.JButton btFire4;
    private javax.swing.JButton btFire5;
    private javax.swing.JButton btFire6;
    private javax.swing.JButton btFire7;
    private javax.swing.JButton btFire8;
    private javax.swing.JButton btFire9;
    private javax.swing.JButton btSchiessenFreiMGUI;
    private javax.swing.JButton btSwingWorker;
    private javax.swing.JCheckBox cbØKM1;
    private javax.swing.JCheckBox cbØKM10;
    private javax.swing.JCheckBox cbØKM2;
    private javax.swing.JCheckBox cbØKM3;
    private javax.swing.JCheckBox cbØKM4;
    private javax.swing.JCheckBox cbØKM5;
    private javax.swing.JCheckBox cbØKM6;
    private javax.swing.JCheckBox cbØKM7;
    private javax.swing.JCheckBox cbØKM8;
    private javax.swing.JCheckBox cbØKM9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JLabel lbVKM1;
    private javax.swing.JLabel lbVKM10;
    private javax.swing.JLabel lbVKM2;
    private javax.swing.JLabel lbVKM3;
    private javax.swing.JLabel lbVKM4;
    private javax.swing.JLabel lbVKM5;
    private javax.swing.JLabel lbVKM6;
    private javax.swing.JLabel lbVKM7;
    private javax.swing.JLabel lbVKM8;
    private javax.swing.JLabel lbVKM9;
    private javax.swing.JLabel lbØKM1;
    private javax.swing.JLabel lbØKM10;
    private javax.swing.JLabel lbØKM2;
    private javax.swing.JLabel lbØKM3;
    private javax.swing.JLabel lbØKM4;
    private javax.swing.JLabel lbØKM5;
    private javax.swing.JLabel lbØKM6;
    private javax.swing.JLabel lbØKM7;
    private javax.swing.JLabel lbØKM8;
    private javax.swing.JLabel lbØKM9;
    private javax.swing.JList liListe;
    private javax.swing.JPanel paAktionMGUI;
    private javax.swing.JPanel paKanoneMan1;
    private javax.swing.JPanel paKanoneMan10;
    private javax.swing.JPanel paKanoneMan2;
    private javax.swing.JPanel paKanoneMan3;
    private javax.swing.JPanel paKanoneMan4;
    private javax.swing.JPanel paKanoneMan5;
    private javax.swing.JPanel paKanoneMan6;
    private javax.swing.JPanel paKanoneMan7;
    private javax.swing.JPanel paKanoneMan8;
    private javax.swing.JPanel paKanoneMan9;
    private javax.swing.JPanel paKanonen13;
    private javax.swing.JPanel paKanonen47;
    private javax.swing.JPanel paKanonen810;
    private javax.swing.JSlider slFertig;
    private javax.swing.JTextField tfVKM1;
    private javax.swing.JTextField tfVKM10;
    private javax.swing.JTextField tfVKM2;
    private javax.swing.JTextField tfVKM3;
    private javax.swing.JTextField tfVKM4;
    private javax.swing.JTextField tfVKM5;
    private javax.swing.JTextField tfVKM6;
    private javax.swing.JTextField tfVKM7;
    private javax.swing.JTextField tfVKM8;
    private javax.swing.JTextField tfVKM9;
    private javax.swing.JTextField tfØKM1;
    private javax.swing.JTextField tfØKM10;
    private javax.swing.JTextField tfØKM2;
    private javax.swing.JTextField tfØKM3;
    private javax.swing.JTextField tfØKM4;
    private javax.swing.JTextField tfØKM5;
    private javax.swing.JTextField tfØKM6;
    private javax.swing.JTextField tfØKM7;
    private javax.swing.JTextField tfØKM8;
    private javax.swing.JTextField tfØKM9;
    // End of variables declaration                   
}

Die Datenklasse

Java:
public class Kanone
{
    private final int durchmesser;
    private final double v;
    private final double energie;

    public Kanone(int durchmesser, double v, double energie)
    {
        this.durchmesser = durchmesser;
        this.v = v;
        this.energie = energie;
    }

    public int getDurchmesser()
    {
        return durchmesser;
    }
}

Die CollectionKlasse

Java:
public class Kanonen
        extends AbstractListModel
{
    private final ArrayList<Kanone> kanonenWerte = new ArrayList<Kanone>();

    public Kanonen()
    {
    }
    
    public void add(Kanone kan)
    {
        kanonenWerte.add(kan);
        super.fireContentsChanged(this, kanonenWerte.size()-1, kanonenWerte.size()-1);
    }

    public void remove(int i)
    {
        kanonenWerte.remove(i);
        super.fireContentsChanged(this, i, i);
    }

    public void removeAll()
    {
        kanonenWerte.removeAll(kanonenWerte);
        super.fireContentsChanged(this, 0, kanonenWerte.size()-1);
    }

    public Kanone getWert(int i)
    {
        return kanonenWerte.get(i);
    }

    public ArrayList<Kanone> getListe()
    {
        return kanonenWerte;
    }

    public int getSize()
    {
        return kanonenWerte.size();
    }

    public Kanone getElementAt(int index)
    {
        return kanonenWerte.get(index);
    }
}

vielleicht könnt ihr mir weiterhelfen...
 
Was hat das mit SwingWorker zu tun von welcher Liste redest Du und hätte man das nicht auf den relevanten Code kürzen können?

Meinst du mit der Liste die ArrayList in der Klasse Kanonen? Das ist jetze die einzige Liste, die ich auf die Schnelle finden konnte, da werden Objekte vom Typ Kanone hinzugefügt. Und wo ist das Problem?
 
Habe mir jetzt nicht deinen ganzen Quellcode angeschaut, aber versteh ich dich richtig, dass du eine Kanone z.B. in deiner JList liliste mit dem eigenen Model im Auswahlmenü in einer bestimmten Art und Weise dargestellt haben möchtest?

Beim Überfliegen habe ich die Stelle nicht gesehen, wo die Ausgabe erfolgen soll, aber mir ist aufgefallen, dass du innerhalb von Kanone keine toString() - Methode überschrieben hast. Möchtest du nun in deiner Ausgabe etwas machen wie:

Java:
System.out.println( "Kanone: " + kanone );

dann wird dort natürlich immer nur die Referenz des Objektes ausgegeben, und nicht der Inhalt. Genauso verhält es sich auch mit der Liste. Um dies anzupassen, musst du einfach die toString() - Methode von Kanone überschreiben, oder eine eigene Formatierungsmethode schreiben, die von einem ListCellRenderer aufgerufen wird. Falls ich mit meiner Vermutung falsch lag, kannst ja vielleicht noch einmal genauer erläutern, wo das Problem verborgen ist, oder ein kleines selbstlaufendes Example bereitstellen, dass das Problem darstellt, da dein bereitgestellter Quelltext so nicht lauffähig ist.

Grüße,
ymene
 
ich habe noch eine Frage bezüglich meines SwingWorkers...

ich lesen jetzt zu testzwecken von der GUI aus einem Textfeld die Geschwindigkeit ein und erzeuge dann damit ein Objekt! und dass automatisch alle 2 sekunden da ich mit den threads jeweils um 1000ms verzögere...

jetzte bekomme ich aber meine geschwindigkeit übers Netzwerkkabel von einer SPS geschickt und zwar mit folgender Klasse:

Java:
public class DefaultClient
{
    public DefaultClient()
    {
    }

    public static String sendAndReceiveLine(String host, int port, String text)
      throws Exception
    {
        InetAddress adress = InetAddress.getByName(host);

        Socket socket = new Socket(adress,port);
        socket.setSoTimeout(5000);

        OutputStream os = socket.getOutputStream();
        OutputStreamWriter ows = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(ows);
        bw.write(text);
        bw.newLine();
        bw.flush();

        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String antwort = br.readLine();

        br.close();
        bw.close();
        return antwort;
    }
}

ich würde jetzt aber gerne das objekt nur dann erzeugen und in die Liste schreiben wenn mit sendAndReceiveLine ein neues Attribut empfangen wurde?

einen tipp wie ich das machen könnte?

danke schon mal im voraus!
 
Warum baust Du die Socketverbindung nicht einmalig auf und hälst die Streams offen?

So wie der Code ausschaut muss zuerst eine Anfrage an die SPS geschickt werden, worauf diese dann antwortet. In Deinem Fall mit der Geschwindigkeit. Soweit richtig?
Jetzt stellt sich nur die Frage, was meinst Du mit:
ein neues Attribut empfangen wurde
Meinst Du damit wenn ein anderer Geschwindigkeitswert empfangen wird?
--> Einfach die letzte Antwort in einer Variablen speichern, da kannst Du ja bei der Antwort vergleichen, ob sich die Geschwindigkeit geändert hat.
 
ja des mit der Anfrage stellen und Antworten mit der Geschwindigkeit ist vollkommen richtig!

mit
ein neues Attribut empfangen wurde
meine ich sobald über sendAndReceiveLine eine Geschwindigkeit empfangen wurde...kann auch der gleiche wert sein obwohl das sehr unwahrscheinlich ist da das messmodul für die geschwindigkeit mit 125ns abtaktet...aber es kann ja mal sein, dass noch keine neue geschwindigkeit zur verfügung steht wenn der SwingWorker dannach fragt..

ist es jetzt am besten das mit nem if zu lösen?
und im if nur dann das Objekt zu erzeugen und mit der methode publish() in die liste zu adden wenn es ein neuer bzw gültiger wert ist?

das mit dem socket immer neu öffnen...hmm gute frage!
würdest Du die Socketverbindung vorher erstellen und dann nur mit übergeben?
 
Die Methode wird ja vom SwingWorker aufgerufen und er muss ja zu mindest solange warten bis readline() etwas zurück liefert.
Was liefert die SPS denn zurück wenn keine Geschwindigkeitsinfo zur Verfügung steht?
Davon kann man es ja abhängig machen ob ein neues Objekt erzeugt wird oder nicht.
würdest Du die Socketverbindung vorher erstellen und dann nur mit übergeben?
Ja, Socketverbindung einmal erstellen und In- und OutputStream in entsprechend verfügbare Variablen speichern oder wo auch immer hin übergeben.
 
entweder kommt der geschwindigkeitswert, oder bsy für beschäftigt, err wenn a fehler vorhanden ist oder off wenn die messung deaktiviert wurde.

des heißt einfach prüfen was kommt und nur wenn ein fließkommawert also a geschw. dann objekt erstellen.

noch ne frage: das heißt der SwingWorker wartet min. solange bei der Stelle wo ich einlese bis von readline() was zurückgeliefert wurde, unabhängig davon wielange ich mit den Threads verzögere?
 
noch ne frage: das heißt der SwingWorker wartet min. solange bei der Stelle wo ich einlese bis von readline() was zurückgeliefert wurde, unabhängig davon wielange ich mit den Threads verzögere?
readline() blockiert solange bis eine komplette Zeile eingelesen wurde. Mit Threads verzögern meinst Du Thread.sleep(...) o.ä. Damit steuerst Du ja in welchen Abständen der SwingWorker an der SPS anfragt.
 

Zurück
Oben