synchronisieren

Status
Nicht offen für weitere Antworten.

Speedy85

Mitglied
Hallo,

ich ich bräuchte mal einen Rat, ich habe eine Programmieraufgabe die ein bssl heikel für mich ist. Ich muss 2 Objekte, zb. Apfel und Laser strahl miteinander synchronisieren, sprich wenn sich der strahl bewegt soll der Apfel das wissen. Und das natürlich ohne 'If und else'. Ich habe 2 Ansätze, mein erster ansatz ist es mit threads zu machen und mein zweiter Ansatz ist es mit JScrollBar zu machen. Was empfehlt ihr mir ?

Vielen Dank im vorraus
Speedy85
 
Hmm, wenn die Beiden Objekte eine gemeinsame Methode nutzen, dann kannst du die Methode mit dem Attribut 'synchronized' synchronisieren. Während Apfel die Methode aufruft, kann dann Laser die Methode nicht mehr aufrufen und umgekehrt, da die Methode blockiert ist.

Was eine JScrollBar damit zu tun hat weiss ich selber auch nicht so genau. Was hattest du denn mit einer JScrollBar geplant?


Aber beschreibe mal genauer was du denn machen musst. Sonst kann ich dir keine wirklich gute Antwort geben wie du das am besten machen kannst.
 
Danke sehr icarus2, aber so einfach ist das programm leider nicht 🙁 ich habe es auch nicht gut beschrieben, tut mir leid. Also solange der Laser auf dem apfel strahlt dreht sich der Apfel schnell um sich selbst, aber sobald der strahl außerhalb ist dann dreht sich der apfel langsamer. Deswegen kam ich auch auf die Scrollbar, so kann ich die positionen besser bestimmen, was wiederrum mehrere if anweisungen benöigt, welches ich leider nicht einsetzen darf.

Viele Grüße
 
Erstmal Grundlegendes zum Malen (und Animieren) in Swing: Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki
Hier ein einfaches Beispiel:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LaserApple extends JFrame {
    public LaserApple() {
        super("LaserApple");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        add(new Animation());
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                new LaserApple().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
    class Animation extends JPanel {
        private final Timer timerApple;
        private final Timer timerLaser;
        private int laser = 300;
        private int apple = 75;
        public Animation() {
            timerApple = new Timer(100, new ActionListener() {
                private int var = 4;
                public void actionPerformed(final ActionEvent e) {
                    var = -var;
                    apple += var;
                    repaint();
                }
            });
            timerLaser = new Timer(3000, new ActionListener() {
                private int var = 100;
                public void actionPerformed(final ActionEvent e) {
                    var = -var;
                    laser = 200 + var;
                    repaint();
                    timerApple.setDelay(laser / 2);
                }
            });
            timerApple.start();
            timerLaser.start();
        }
        @Override
        protected void paintComponent(final Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.GREEN);
            g.fillOval(apple, 125, 50, 50);
            g.setColor(Color.RED);
            g.fillOval(laser, 150, 10, 10);
        }
    }
}
Wir können auch zwei Klassen Apple und Laser anlegen, wo wir jeweils Timer, Position und Malcode reinpacken. Das Panel würde danach etwa so aussehen:
Java:
class Animation extends JPanel {
    private final Apple appleObject = new Apple(this);
    private final Laser laserObject = new Laser(this, appleObject);
    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);
        appleObject.paint(g);
        laserObject.paint(g);
    }
}
 
Zuletzt bearbeitet:
Danke sehr Herr Uhres,

das Programm ist echt gut und hilft mir sicherlich weiter obwohl es einige Stufen zu hoch für mich ist 😉 ist das die einzige methode es so laufen zu bringen ? Gibt es vielleicht keine einfachere Methode ? Anfängerfreundlich 😉


Viele Grüße
Speedy85
 
Einfacher geht's wohl kaum. Du kannst ja eine Zeile, die dir unverständlich ist, auskommentieren, oder Parameter verändern, und schauen was passiert. Oder uns sagen, was du nicht verstehst.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben