Threads und Swing bzw. AWT

Status
Nicht offen für weitere Antworten.

Paddel

Bekanntes Mitglied
Code:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.RandomAccess;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;




public class Quicksort extends Frame implements Runnable{
Button berechnen = new Button("berechnen");

		int[] zahlen = new int[300];
			public Quicksort(){
				super();
			
				
				for(int i = 0;i<300;i++)
					zahlen[i] = (int) (Math.random() * 300);
			      setLayout(new BorderLayout());
			      setVisible(true);
			      setSize(400, 500);
			      add(berechnen,BorderLayout.SOUTH);
			      berechnen.addActionListener(new schalterBerechnen());
	
			
//			berechnen.addActionListener(new schalterBerechnen());
			 

			}
			
		public void quicksort(int i, int j){
			if(i < j){
			int l = i;
			int r = j;
			int p = zahlen[(i+j) / 2];
			while(i < j){
				while(zahlen[i] < p) i++;
				while(zahlen[j] > p)  j--;
				if(i <= j) {
					swap(i,j);
				i++;j--;
				}
			}
			
			quicksort(l, j);
			quicksort(i, r);
			}
		}
		public void start2()
		{
			quicksort(0, zahlen.length-1);
		}
		public void paint(Graphics g){
			for(int i = 0;i<zahlen.length;i++)
				g.fillRect(i, zahlen[i], 5, 5);
			
		}
		
		class schalterBerechnen implements ActionListener{

			public void actionPerformed(ActionEvent arg0) {
			
				start2();
				
			}
			
		}
		public void swap(int i,int j){
			int tmp = zahlen[i];
			zahlen[i] = zahlen[j];
			zahlen[j] = tmp;
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
			
				e.printStackTrace();
			}
			repaint();
		}
		public void ausgabe(){
			for(int i = 0; i < zahlen.length;i++)
				System.out.println(zahlen[i]);
		}
		public static void main(String[] args) {
			Quicksort algo = new Quicksort();
			algo.run();			
			
			
			
		}
		public void run() {
	
			
		}
}
Hallo. Das Programm soll Quicksort grafisch ausführen sobald ich auf den Button "berechnen" klicke. Ohne Threads funktionierte das ganze auch perfekt. Allerdings brauchte ich die Threads um die Zeit zu stoppen. Hatte das dann erst mit Swing gemacht und sobald ich auf den Button geklickt habe lief es nicht mehr. Jetzt habe ich es in AWT umgeschrieben weil ich gelesen hatte das SWING Probleme mit Threads hat. Jetzt stürzt das ganze allerdings schon wieder ab. Gibt es einen Trick um eine Klasse als Thread zu starten und einen Action Listener anzusürechen in einem Thread. Ohne Threads geht das alles reibungslos.

Und ich hätte noch eine 2te Frage. Meine Buttons erscheinen erst wenn ich einmal auf den Rand klicke. Vorher sind die gar nicht vorhanden. Wenn mir das jemand noch ekrlären können wäre ich sehr dankbar für...
P.S. Antwort kann 24 Stunden dauern weil ich kein Internet zu Hause habe
Gruss
 
Paddel hat gesagt.:
Allerdings brauchte ich die Threads um die Zeit zu stoppen.
Nö, brauch man nicht ... is auch ungenauer, weil zum Starten der Threads auch Zeit mit draufgeht
Paddel hat gesagt.:
Jetzt habe ich es in AWT umgeschrieben weil ich gelesen hatte das SWING Probleme mit Threads hat.
Swing hat keine Probleme mit Threads, de facto IST Swing ein Thread :arrow: wenn man es richtig einsetzt, zb. so wie es sich gehört über invokeLater
Paddel hat gesagt.:
Gibt es einen Trick um eine Klasse als Thread zu starten und einen Action Listener anzusürechen in einem Thread.
sehr leicht:
Code:
class blub extends Thread {
   blub() {
      this.start();
}
   public void run() {
      listener l = new listener();
      l.machWas(listener.aktion1);
      meinekomponente.addActionListener(l);
      //den code hier
   }
}
class listener implements ActionListener {
   private String Wert = "";
   public final static byte aktion1 = 1;
   private byte aktion = 0;
   listener() {
      //initialisierung hier?
}
   void setzeWas(String wert) {
      this.wert = wert
}
   void machWas(byte aktion) {
      this.aktion = aktion;
      //beeinflussender Code hier, so lassen sich sehr effizient Abläufe beeinflussen
}
   public void actionPerformed() {
      // hier is was passiert
}}
Paddel hat gesagt.:
Meine Buttons erscheinen erst wenn ich einmal auf den Rand klicke.
also ich muss leider sagen: dein Quelltext ist die Hölle ... Fehler über Fehler und keine erkennbare logische Struktur. Aber ich kann mir (ohne den Code zur Gänze gelesen zu haben) vorstellen an was es liegt:

JFrame visible gemacht bevor die Buttons hinzugefügt wurden. Bei AWT/Swing muss man sehr auf die Reihenfoplge bestimmter Befehle achten, weil diese sofort eine Aktion auslösen bzw. als nächstes in der Queue stehen, Swing ist relativ träge und updated sich nicht immer selbst.

Wende doch BITTE einmal OOP auf deinen Code an, dann erkläre ich dir auch detailliert wo die Fehler liegen
 
Nimm wieder Swing, AWT ist veraltet. Swing ist nicht threadsicher, das ist richtig, aber kein einziges Grafisches Toolkit in keiner einzigen Sprache ist threadsafe, das ist nunmal so.
Nicht threadsafe heißt übrigens nicht, das man keine Threads verwenden darf, sondern nur, das bestimmte Methoden des Toolkits aus dem Event Dispatch Thread gestartet werden müssen.
Dein Problem liegt übrigens daran, das du keinen Thread startest, sondern einfach eine Methode aufrufst. Threads startet man mit new Thread(runnable).start()
 
Code:
/*
 * Quicksort.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Quicksort extends JFrame implements Runnable {
    private JButton berechnen = new JButton("berechnen");
    private int[] zahlen = new int[300];
    public Quicksort() {
        super();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        for (int i = 0; i < 300; i++) {
            zahlen[i] = (int) (Math.random() * 300);
        }
        setSize(400, 500);
        add(berechnen, BorderLayout.SOUTH);
        berechnen.addActionListener(new SchalterBerechnen());
        add(new DrawingPanel());
    }
    public void quicksort(int i, int j) {
        if (i < j) {
            int l = i;
            int r = j;
            int p = zahlen[(i + j) / 2];
            while (i < j) {
                while (zahlen[i] < p) {
                    i++;
                }
                while (zahlen[j] > p) {
                    j--;
                }
                if (i <= j) {
                    swap(i, j);
                    i++;
                    j--;
                }
            }
            quicksort(l, j);
            quicksort(i, r);
        }
    }
    public void swap(int i, int j) {
        int tmp = zahlen[i];
        zahlen[i] = zahlen[j];
        zahlen[j] = tmp;
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {

            e.printStackTrace();
        }
        repaint();
    }
    public void ausgabe() {
        for (int i = 0; i < zahlen.length; i++) {
            System.out.println(zahlen[i]);
        }
    }
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Quicksort().setVisible(true);
            }
        });
    }
    @Override
    public void run() {
        quicksort(0, zahlen.length - 1);
        berechnen.setEnabled(true);
    }
    class SchalterBerechnen implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            berechnen.setEnabled(false);
            new Thread(Quicksort.this).start();
        }
    }
    class DrawingPanel extends JPanel {
        @Override
        protected void paintComponent(final Graphics g) {
            super.paintComponent(g);
            for (int i = 0; i < zahlen.length; i++) {
                g.fillRect(i, zahlen[i], 5, 5);
            }
        }
    }
}
 
mit wem redest du? Was willst du damit sagen?

Im Übrigen is der Quelltext von André unvollständig und hält sich an absolut keine Norm ... aber zumindest is es ein funktionierendes (wenn ergänzt) Beispiel
 
tha_specializt hat gesagt.:
Im Übrigen is der Quelltext von André unvollständig und hält sich an absolut keine Norm ... aber zumindest is es ein funktionierendes (wenn ergänzt) Beispiel
Sagst du? :shock: Im gleichen Thread in dem du das gepostet hast?
Code:
class blub extends Thread {
   blub() {
      this.start();
}
   public void run() {
      listener l = new listener();
      l.machWas(listener.aktion1);
      meinekomponente.addActionListener(l);
      //den code hier
   }
}
class listener implements ActionListener {
   private String Wert = "";
   public final static byte aktion1 = 1;
   private byte aktion = 0;
   listener() {
      //initialisierung hier?
}
   void setzeWas(String wert) {
      this.wert = wert
}
   void machWas(byte aktion) {
      this.aktion = aktion;
      //beeinflussender Code hier, so lassen sich sehr effizient Abläufe beeinflussen
}
   public void actionPerformed() {
      // hier is was passiert
}}
 
1) das war n Beispiel
2) kein allzu schlechtes, immerhin besser als grossgeschriebene Klassennamen und Befehle, die anscheinend aus dem nichts kommen :arrow: kennst du
Code:
this
? Exzessiv nutzen, das ist OOP
2) seit wann muss man um Erlaubnis fragen, wenn man eigene Fehler nachträglich ausbessert?
3) du assoziierst Pseudonyme mit irgendwelchen Absichten / Ansichten, du "putziger" :arrow: geh bitte in irgendein 1337h4xx0r-Forum
4) Bitte mit der infantilen Trollerei aufhören?
 
Wer Beiträge nachträglich sinnentstellend editiert UND sich dann wundert das nachfolgende Beiträge keinen Sinn mehr machen ...
 
also wollte hier nich für Streit sorgen. Aber danke es geht jetzt beides. Wusste nur nicht wo ich nachschauen musste... besten Dank!
 
Es bist nicht du Paddel der für Streit sorgt, es ist ein gewisser Spezialisten-Troll der keinen Anstand (und Wissen...) hat :wink:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben