Event Handling Neu zeichnen nur wenn Berechnung fertig ist

Ich habe ein Programm mit drei Klassen (siehe Code)
In Test finden langwierige Berechnungen statt, deren Ergebnisse graphisch dargestellt werden sollen.
(Statt der langen Berechnungen habe ich hier nur "sleep(1000)" geschrieben)
Ich möchte, dass die Graphik nicht alle 20 Millisekunden neu gezeichnet wird (wie es durch "Timer...ActionListener...ActionEvent...repaint" geschehen würde), sondern immer nur, wenn eine Berechnung abgeschlossen ist. Das ist mir wahrscheinlich auch gelungen, aber sehr umständlich.
Kann mir jemand erklären, wie es elegant geht?

[CODE lang="java" title="Klasse: Test"]public class Test {

static int i;

public static void main(String[] args) {
new Window();
for (i=1; i<6; i++) {sleep(1000);}
}

private static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException ignored) {
}
}
}[/CODE]

[CODE lang="java" title="Klasse: Window"]import javax.swing.JFrame;

public class Window extends JFrame{
private final Panel Pan;

public Window() {
this.Pan = new Panel();
add(Pan);
pack();
setVisible(true);
}
}[/CODE]

[CODE lang="java" title="Klasse: Panel"]import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Panel extends JPanel {

private final Dimension prefSize = new Dimension(200, 300);
private Timer t;
int j;
public Panel() {

setPreferredSize(prefSize);


t = new Timer(20, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {repaint();}
}
);
j=Test.i;
t.start();
}

@Override
public void paint(Graphics g)
{
if (Test.i!=j) {
g.drawLine(50, 50+Test.i*20, 100, 100);
j=Test.i;
}
}
}[/CODE]

Danke
 

mihe7

Top Contributor
Du lagerst die langwierige Berechnung in einen eigenen Thread aus und wenn sie fertig ist, rufst Du repaint() auf. Das kannst Du direkt per Thread machen, per ExecutorService oder auch per SwingWorker. Letzterer erleichtert die Zusammenarbeit mit dem UI ein wenig.
 

Blender3D

Top Contributor
[CODE lang="java" title="TestDurationCalc"]public class TestDurationCalc {

public static void main(String[] args) {
JFrame frame = new JFrame("Duration calc");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new CalcPanel(600, 400));
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}

}[/CODE]
[CODE lang="java" title="CalcPanel" highlight="36-37, 62-66, 12"]import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JList;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class CalcPanel extends JPanel implements DurationCalulationListener {
private JTextField[] input = new JTextField[3];
private final static int K = 0;
private final static int X = 1;
private final static int D = 2;
private DefaultListModel<String> model = new DefaultListModel<>();
private JList<String> list = new JList<String>(model);
private JButton ok = new JButton("ok");

public CalcPanel(int width, int height) {
setPreferredSize(new Dimension(width, height));
add(list);
int w = (int) ((width - width / 2) * .9) / 4;
for (int i = 0; i < input.length; i++) {
input = new JTextField();
input.setPreferredSize(new Dimension(w, 30));
input.setPreferredSize(new Dimension(w, 30));
add(input);
}
list.setPreferredSize(new Dimension(width / 2, height));
add(ok);
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LineCalc calc = getCalculation();
calc.calculate();
}

});

}

private LineCalc getCalculation() {
return new LineCalc(this, getParam());
}

private double[] getParam() {
double[] param = new double[3];
for (int i = 0; i < input.length; i++) {
try {
param = Double.parseDouble(input.getText());
} catch (NumberFormatException e) {
input.setText("0");
param = 0;
}
}
return param;
}

@Override
public void update(Object sender, double[] param, double[] result) {
model.addElement(result[0] + " = " + param[K] + "x" + param[X] + "+" + param[D]);
list.setSelectedIndex(model.getSize() - 1);
list.repaint();
}
}[/CODE]
[CODE lang="java" title="Listener Interface"]public interface DurationCalulationListener {
public void update(Object sender, double[] param, double[] result);
}[/CODE]
Java:
public abstract class DurationCalculation implements Runnable {
    private DurationCalulationListener listener;
    /**
     * Vector for results.
     */
    protected double[] param;
    protected double[] result;

    public DurationCalculation(DurationCalulationListener listener, double[] param) {
        if (listener == null)
            throw new IllegalArgumentException("Listener null not allowes!");
        this.listener = listener;
        this.param = param;
    }

    public void calculate() {
        (new Thread(this)).start();
    }

    /**
     * Do calculation here. Use {@link #result} and {@link #param}.
     */
    protected abstract void doCalculation();

    @Override
    public final void run() {
        doCalculation();
        listener.update(this, param, result);
    }

}
[CODE lang="java" title="Geradengleichung" highlight="16-23, 9"]public class LineCalc extends DurationCalculation {

private final static int K = 0;
private final static int X = 1;
private final static int D = 2;

public LineCalc(DurationCalulationListener listener, double... param) {
super(listener, param);
result = new double[1]; // y = k*x+d
}

/**
* Calculates y of a line by given parameters. y = k*x+d
*/
@Override
protected void doCalculation() {
result[0] = param[K] * param[X] + param[D];
try { // delay simulates long time calculation
Thread.sleep(2000, 0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}[/CODE]
 
Danke für die schnellen Antworten.
Leider habe ich (Anfänger im objektorientierten Programmieren) beide nicht verstanden.
Ich denke, dass ich mich mal mit zugleich ablaufenden Threads befassen sollte.
Kann mir jemand ein Tutorial dazu empfehlen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
I swing fenster neu zeichnen, wenn überdeckt AWT, Swing, JavaFX & SWT 8
W Swing Bild zeichnen wenn Maus an bestimmter Position ist AWT, Swing, JavaFX & SWT 4
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
C Funktionen zeichnen AWT, Swing, JavaFX & SWT 16
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
M Auf einem Hintergrundbild zeichnen AWT, Swing, JavaFX & SWT 2
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
S Font laden, Wort zeichnen und animieren..? AWT, Swing, JavaFX & SWT 2
S Bild von Punkt zu Punkt zeichnen AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben