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
 

icarus2

Top Contributor
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.
 

Speedy85

Mitglied
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
 

André Uhres

Top Contributor
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:

Speedy85

Mitglied
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
 

André Uhres

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Verzeichnis synchronisieren Java Basics - Anfänger-Themen 3
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
G Ersetzen eines confirm dialogs/ synchronisieren von methoden Java Basics - Anfänger-Themen 6
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Thread Synchronisieren Java Basics - Anfänger-Themen 4
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
S Synchronisieren einer Linked List Java Basics - Anfänger-Themen 16
G Threads synchronisieren von threads Java Basics - Anfänger-Themen 4
Dit_ Methoden-Threads synchronisieren Java Basics - Anfänger-Themen 9
A Datentypen Verschiedene Threads synchronisieren Java Basics - Anfänger-Themen 3
L Mehr als zwei Threads synchronisieren Java Basics - Anfänger-Themen 7
S Threads synchronisieren Java Basics - Anfänger-Themen 4
G Zugriff synchronisieren Java Basics - Anfänger-Themen 7
G Vector Synchronisieren Java Basics - Anfänger-Themen 3
F 2 Programmteile synchronisieren (Threads?) Java Basics - Anfänger-Themen 3
M TextFelder synchronisieren Java Basics - Anfänger-Themen 14
V Threads verschiedener Klassen synchronisieren Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben