AWT Artefakte bei AWT-Rendering durch parallelen Thread

jface

Mitglied
Hi,
ich hab folgendes Szenario. In meinem Programm gibt es zwei Tabs. Tab A stellt ein Signal dar, in Tab B wird ein Chronospektrum des Signals angezeigt (FFT). Soblad sich das Signal ändert (z.B. weiterscrollen in der Zeitachse) werden beide Tabs neu gezeichnet. Da die FFT einige Sekunde zur Berechnung braucht, hab ich sie in einen eigenen Thread ausgelagert, was auch wie erwartet im Hintergrund mein Tab B updatet. Das Problem dabei ist nur, das bis der Thread fertig ist, meine AWT-Darstellung des Signals mit Artefaktenuebersät wird. Ohne langwierige FFT-Berechnung sieht man das Problem natuerlich nicht. Ich weis nicht woher dieses Verhalten stammt....

Hier mal der Code:

Java:
public void displayedRecordModified() {
       
        //Die Grafik im Tab A
        polysomnograph.repaint();
        
        // Grafik in Tab B
        polysomnograph.repaint3D();
      
        
    }
                 
 public void repaint3D(){
               JPanel parent = (JPanel) this.mainWindow.jTabbedPane.getComponent(1);
	        
	        if(fft3d == null)
		        fft3d = new FFT3D(graph,graph2, navigationSlider.getValue(),
		        		getEpochDuration(),
		                (double) 0.0 ,
		                (double) 1.0, this,parent );
	        //else
	        	fft3d.update(graph,graph2, navigationSlider.getValue(),
			    		getEpochDuration(),
			            (double) 0.0 ,
			            (double) 1.0, this,parent ); 
		    
	        Thread th = new Thread(fft3d);
	        th.start();
	 }

und hier die run methode von FFT3D:

Java:
public void run() {    
        parent.removeAll();    
        JPanel tmp = new JPanel(new FlowLayout(FlowLayout.CENTER));
        tmp.add(new JLabel("FFT wird erstellt"));
        parent.add(tmp,BorderLayout.CENTER);  
        generate3DFFLR(graph, graph2, startSecond, duration, startPosition, endPosition, polysomnograph);
        parent.removeAll();
        parent.add(fft3DArea,BorderLayout.CENTER); 
        parent.getParent().repaint();
        
    }

Ich hab noch zwei Scrrenshots angehängt. Das erste bild zeigt die Ausgabe wie sie sein sollte und auch ist , nachdem die FFT fertig ist. Das zweite Bild zeigt das Signal wie es aussieht, während der andere Thread die FFt prozessiert. (Zum Teil gibt es noch mehr dieser rechteckigen Ausreisser )


Viele Grüsse

jface
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Öhm. Bezeichnest du mit "Fraktale" diese Rechteckigen Dinger?
Anhand des geposteten ist es schwer, das was zu sagen. Wer berechnet und Zeichnet denn diese Blaue Linie (und wie) ?
 

jface

Mitglied
üps. mein natürlich Artefakte.

Hier mal der code, der eine der blauen Linien letztendlich zeichnet.


Java:
private void displayData(Graphics2D g, int[] x, int[] y, Color color) {
        Color originalColor = g.getColor();
        g.setColor(color);

        g.drawPolyline(x, y, x.length);
        g.setColor(originalColor);
    }



Aufgerufen wird das ganze ueber:

Java:
public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;
        
        //drawYAxis(g2D);

        JEDFGraph[] tabGraph = montage.getAllGraph();

        float heightOfAGraph = getGraphHeight();
        
           //malt eine linie (im beispielbild sinds insgesamt 4)
        for (int i = 0; i < tabGraph.length; i++) {
            tabGraph[i].draw(g2D, i * heightOfAGraph);
}

die letzte Zeile ruft diese Methode auf


Java:
public void draw(Graphics2D g, float yOffset) {
        double width = SwingUtilities.calculateInnerArea(polysomnograph,
                new Rectangle()).getWidth();
        double height = polysomnograph.getGraphHeight();

       // drawXAxis(g, yOffset, width, height);
        drawGraph(g, yOffset, width, height);
        //drawHighlightedPart(g, yOffset, width, height);
    }

drawGraph holt die Daten und lässt schliesslich das Signal malen:

Java:
 private void drawGraph(Graphics2D g2D, float yOffset, double width,
                           double height) {
        short[] rawData = signal.readSecondsAndAPoint(polysomnograph.
                getStartSecond(), polysomnograph.getEpochDuration());
        if (rawData.length == 0) {
            return;
        }
        int[][] processedData = processData(rawData, 0f, yOffset, (float) width,
                                            (float) height); //processNormalData(rawData,yOffset);

        boolean useNormalColor = true;
        PreciseScoring preciseScoring = polysomnograph.getPreciseScoring();

        if (preciseScoring != null) {
            useNormalColor = !preciseScoring.hasFocus();
        }
         
        //siehe anfang des Beitags
        displayData(g2D, processedData[0], processedData[1],
                    (useNormalColor ? drawColor : fadedColor));
    }

Was vielleicht noch von Interesse ist:
Wenn die Zeile
Java:
parent.getParent().repaint();
in der run() Methode weggelassen wird, dann bleiben die Artefakte bestehen. Das ganze muss also nochmal gezeichnet werden , damits wie gewuenscht aussieht.
 

jface

Mitglied
Wenn ich einen Breakpoint in der Zeile

Java:
generate3DFFLR(graph, graph2, startSecond, duration, startPosition, endPosition, polysomnograph);

in der Methode run() setze, also gerade vor dem Abschnitt der das Problem mit den Artefakten erzeugt, dann gibts keine Artefakte, wenn ich das Programm nach der Pause wieder weiter laufen lasse.

Hab versucht, den Brakpoint durch ein
Java:
try {
			sleep(500);
		} catch (InterruptedException e) {			
			e.printStackTrace();
		}
zu ersetzen, hat aber leider nicht funktioniert. (FFT3D erbt hier von Thread, statt einem Runnable interface).

Oder mit was könnte man eine Breakpoint "simulieren"?
 

Marco13

Top Contributor
Am besten gar nichts. Das ganze gepostete hilft einem nicht weiter, weil keiner auch nur einen Hauch eines Überblicks darüber hat, was dort passiert. (Wer zeichnet die Linie? - Das wird mit drawPolyline gemacht! - Wer berechet die Linie? - Das wird in processData gemacht! - Was macht processData? Das-und-das! Und in welchem Thread, und was hat das mit dem Zeichnen zu tun? ...)

Veranlasse nach der Berechnung ein neues "repaint", und hoffe, dass es dann funktioniert... :bahnhof:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Anderes (schlechteres) Font-Rendering in OpenJDK 8 AWT, Swing, JavaFX & SWT 21
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
O 3D-Grafik OpenGL CubeMaps - Skybox Rendering AWT, Swing, JavaFX & SWT 0
ToBJo JavaFX Rendering beschleunigen AWT, Swing, JavaFX & SWT 3
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
A Panelwechsel durch RadioButtons AWT, Swing, JavaFX & SWT 1
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
S JavaFX Tab durch Enter ersetzten AWT, Swing, JavaFX & SWT 3
M Swing Durch Usereingabe neues Objekt AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
S Speicher Leak durch Tabellenaktualisierung AWT, Swing, JavaFX & SWT 5
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
S AWT JTextFields durch Array im JMenu erzeugen? AWT, Swing, JavaFX & SWT 19
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
G Swing Durch GlassPane auf Button klicken und ActionEvent auslösen AWT, Swing, JavaFX & SWT 0
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
P Programm durch Dateiaufruf starten und Datei öffnen AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
Z JavaFX Inhalt einer ViewTable durch Aktion einer Menubar ändern welche in einer anderen fxml ist AWT, Swing, JavaFX & SWT 4
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
F 2D-Grafik Objekt durch Einwirkung einer Kraft im Raum bewegen AWT, Swing, JavaFX & SWT 14
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
P JFrame manuell Grösse verändern durch 'mouseDragged' AWT, Swing, JavaFX & SWT 3
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
P Rendern von Geraden im 3 dimensionalen Raum durch Rotationen AWT, Swing, JavaFX & SWT 0
S Swing Navigation durch JPanels AWT, Swing, JavaFX & SWT 0
D Swing Durch JFRAME hindurch klicken AWT, Swing, JavaFX & SWT 2
C Swing Durch Inhaltsänderung eines JTextfields eine Funktion aufrufen AWT, Swing, JavaFX & SWT 5
achillesat SWT Browser öffnen durch Button click AWT, Swing, JavaFX & SWT 5
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
S Objekt durch Tasteneingabe mehrmals drehen AWT, Swing, JavaFX & SWT 9
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
A Swing JTextField durch einen JButton leeren AWT, Swing, JavaFX & SWT 15
A Swing Anpassen der Spaltenbreite durch die länge eines Strings AWT, Swing, JavaFX & SWT 3
P JPanel- Listener durch JTextArea aktivieren AWT, Swing, JavaFX & SWT 8
P Durch Bilder Scrollen AWT, Swing, JavaFX & SWT 2
J Swing JButton durch Eingabe von Zahlen in JTextFields aktivieren AWT, Swing, JavaFX & SWT 3
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
S Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen AWT, Swing, JavaFX & SWT 8
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
C Swing Fensterresize durch doppelklick - wie die neue Grösse erhalten? AWT, Swing, JavaFX & SWT 3
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
S SWT Shell durch Event in der Größe verändern AWT, Swing, JavaFX & SWT 7
F Drag & Drop durch Verbindungslinien AWT, Swing, JavaFX & SWT 10
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
L SWT Text SelectionText ersetzen durch anderen String AWT, Swing, JavaFX & SWT 6
O keine ähnliche Farben durch Random in Java AWT, Swing, JavaFX & SWT 21
L ListSelectionListener durch Code auslösen AWT, Swing, JavaFX & SWT 3
M Ein Tab eine JTabbedPane durch Button Druck öffen AWT, Swing, JavaFX & SWT 2
Shanks Hintergrundfarbe durch Button click ändern ?? AWT, Swing, JavaFX & SWT 6
R Durch Listener lässt sich Programm nicht mehr ausführen AWT, Swing, JavaFX & SWT 4
G Zeile in JTable durch rechte Maustaste manipulieren AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
G Menü verschwindet durch .setText() AWT, Swing, JavaFX & SWT 4
A JScrollBar durch Button ersetzten AWT, Swing, JavaFX & SWT 2
xehpuk Swing Komponenten werden durch setFont() winzig AWT, Swing, JavaFX & SWT 3
T neues Fenster durch Button öffnen funktioniert nicht!! AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
B bin am verzweifeln, will auf knopfdruck durch ne überprüfung die labels unsichtbar machen AWT, Swing, JavaFX & SWT 2
V JTable - SelectionMode wird durch RowFilter verändert AWT, Swing, JavaFX & SWT 2
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
B Pfade durch Farbräume definieren AWT, Swing, JavaFX & SWT 20
Semox Swing Kreis löschen durch Mausklick in der Nähe AWT, Swing, JavaFX & SWT 2
E Swing JPanels durch ziehen am Rand vergrößern/verkleinern?! AWT, Swing, JavaFX & SWT 2
Z JPanel wird erst durch aufziehen des Fensters sichtbar AWT, Swing, JavaFX & SWT 3
S Programmablauf durch "wait for Button" unterbrechen AWT, Swing, JavaFX & SWT 5
P jframe eingabe durch button AWT, Swing, JavaFX & SWT 2
E Login wird durch NullPointerException abgebrochen AWT, Swing, JavaFX & SWT 10
badfish Swing JPanel austauschen durch Button-Druck AWT, Swing, JavaFX & SWT 6
D Swing Storage von / Zugriff auf und durch Actions AWT, Swing, JavaFX & SWT 5
O JSlider - wie unterscheide ich mit Maus verändert und durch setValue verändert. AWT, Swing, JavaFX & SWT 16
T JTable durch ActionEvent befüllen AWT, Swing, JavaFX & SWT 3
U Tab schließen durch Button in Panel AWT, Swing, JavaFX & SWT 7
D ausgewählte Textstellen scheinen durch Dialog durch AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben