# Swing repaint in JavaFX Anwendung



## javampir (11. Aug 2016)

Hallo alle zusammen,

ich habe eine JavaFX-Anwendung, welche mit SwingNode Swing-Content darstellen soll. Innerhalb von Swing werden repaint-Aufrufe getätigt. Diese scheinen aber komplett ignoriert, obwohl der Content beim Start gezeichnet wird. Die folgenden beiden Klassen zeigen das Verhalten:


```
package swingfxtest;

import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javax.swing.SwingUtilities;

public class UI extends Application {
   
    public static void main(String[] args) {
        launch(args);
    }
   
    @Override
    public void start(Stage stage) {
        SwingNode sn = new SwingNode();
       
        SwingUtilities.invokeLater(() -> {
            PaintPane p = new PaintPane();
            sn.setContent(p);
        });
       
        StackPane sp = new StackPane();
        sp.getChildren().add(sn);
       
        Scene scene = new Scene(sp, 800, 800);
        stage.setScene(scene);
        stage.show();
    }
}
```


```
package swingfxtest;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class PaintPane extends JPanel {
   
    private boolean b = false;
   
    public PaintPane() {
        super();
       
        setBackground(Color.red);
       
        new Thread(() -> {
            repaint();
           
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {}
        }).start();
    }
   
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
       
        b = !b;
       
        g.setColor(b ? Color.yellow : Color.green);
        g.fillRect(20, 20, 400, 400);
    }
}
```

Hofentlich gibts hier nur ne Dummheit von mir...

Grüße
javampir


----------



## Flown (11. Aug 2016)

Repaint sachen müssen in den EDT eingeordent werden. Verwuch doch mal deine updates mit `SwingUtilities.invokeLater(...)` zu tätigen.

PS: Mische Swing und Fx nicht!


----------



## javampir (11. Aug 2016)

Macht leider keinen Unterschied...



Flown hat gesagt.:


> PS: Mische Swing und Fx nicht!


Ist leider grad wahrscheinlich unvermeidbar...


----------



## AndyJ (15. Aug 2016)

Der Thread, den du da im Konstruktor baust, zeichnet die Komponente genau einmal, wartet 500 ms und terminiert dann.   

```
new Thread(() -> {
  repaint();
   
  try {
  Thread.sleep(500);
  } catch (InterruptedException ex) {}
  }).start();
```
 
Wenn du erwartest, dass dieser Thread continuierlich repaint aufruft musst Du einen Loop verwenden. Z.B.:


```
new Thread(() -> {
   while (!Thread.currentThread().isInterrupted())
     repaint();     
     try {
       Thread.sleep(500);
     } catch (InterruptedException ex) {
       Thread.currentThread().interrupt();
  break;
     }
   }
}).start();
```

Allerdings sollen UI Updates nur auf dem EDT (Event Dispatcher Thread) gemacht werden. Also:


```
new Thread(() -> {
   while (!Thread.currentThread().isInterrupted())
     SwingUtilities.invokeLater(() -> repaint());     
     try {
       Thread.sleep(500);
     } catch (InterruptedException ex) {
       Thread.currentThread().interrupt();
  break;
     }
   }
}).start();
```

Cheers,
Andy

Wir haben hier schon JavaFX und Swing zusammen verwendet, aber wenn es mehr als ein SwingNode ist, wird es ziemlich buggy. Deswegen benutze ich jetzt SWT. Aber man kann es sich ja nicht immer aussuchen.


----------

