Ball auf Panel hüpfen lassen

Status
Nicht offen für weitere Antworten.

Paddre

Mitglied
Hi
In Informatik haben wir ein einfaches programm geschrieben, welches einen Ball auf dem Fenster fallen lässt.
Das sieht dann quasi so aus, dass ein Ball gezeichnet wird, der als wenn schwerkraft herrschen würde mit einer bestimmten x-Richtung auf den "Boden" fällt uns hochfedert und denn immer kleinerre Sprünge macht... denk ma ihr könnts euch vorstellen...sieht halt ähnlich aus wie bei solitär wenn man gewonnen hat und die Karten runterfallen ;)

Das wollte ich auf ein eingerahmtes Panel verlagern mit weißem Hintergrund...der Optik wegen...aber irgendwie erscheint das Panel nicht. Ich deh nur das normale contentPane-Panel :-(

Code:
public class Frame1 extends JFrame {
    boolean sichtbar = false;
    int n,r=15,breite,hoehe;
    int[] x,y,vx,vy;
    JPanel contentPane;
    BorderLayout borderLayout1 = new BorderLayout();
    JPanel jPanel2 = new JPanel();
    public Frame1() {
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

 
    private void jbInit() throws Exception {
        breite = jPanel2.getWidth();
        hoehe = jPanel2.getHeight();
        x = new int [5];
        y = new int [5];
        vx = new int [5];
        vy = new int [5];
        for (n=1; n<2; n++) {
            x[n] = (int) Math.round(Math.random() * (breite - 50) + 25);
            y[n] = (int) Math.round(Math.random() * (hoehe - 50) + 25);
            vx[n] = (int) Math.round(Math.random() * 20 - 10);
            vy[n] = (int) Math.round(Math.random() * 20 - 10);
        }
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(borderLayout1);
        setSize(new Dimension(400, 300));
        setTitle("Frame-Titel");
        this.getContentPane().setLayout(null);
        jPanel2.setBackground(Color.white);
        jPanel2.setBorder(BorderFactory.createLineBorder(Color.black));
        jPanel2.setBounds(new Rectangle(6, 17, 387, 264));
        this.setResizable(false);
        Graphics g = jPanel2.getGraphics();
        paint(g);
    this.getContentPane().add(jPanel2);
    }

  //zeichnen
 
  public void paint(Graphics g)
    {
        int m,l;
        g.setColor(Color.red);
        g.setXORMode(Color.green);
        if (!sichtbar)
        {
            for(m=1; m<2; m++) {
                x[m] = x[m] + vx[m];
                y[m] = y[m] + vy[m];
                if (x[m] > breite - r - Math.abs(vx[m]) || (x[0] == x[1]) ||
                    (x[m] <= r + Math.abs(vx[m]))) vx[m] = -vx[m];

                if (y[m] > hoehe - r - Math.abs(vy[m]) || (y[0] == y[1]) ||
                    (y[m] <= r + Math.abs(vy[m]))) vy[m] = -vy[m];
                vy[m] = vy[m]+1;
                y[m] = y[m] + vy[m];
                g.fillOval(x[m] - r, y[m] - r, 2 * r, 2 * r);
            }
            pause(50);
            repaint(50);
            sichtbar=true;
        }
        else
        {

            for (l=1; l<2; l++) {
                g.fillOval(x[l] - r, y[l] - r, 2 * r, 2 * r);
                g.setColor(Color.black);
                g.fillOval(x[l] - r / 6, y[l] - r / 6, 2 * r / 6, 2 * r / 6);
            }
            repaint(50);
            sichtbar=false;
        }
    }

    public void update(Graphics g)
    {
        paint(g);
    }

    private void pause(int ms)
    {
        try
        {
            Thread.sleep(ms);
        }
        catch(InterruptedException e){}
    }
}
 

Marco13

Top Contributor
Ohne mal auf Fragen zu antworten, die nicht gestellt wurden: Wer hat euch .. "veranlaßt", das so zu schreiben? Also - hat euer Lehrer (oder so) gesagt, das wäre OK so?
 

Paddre

Mitglied
das stand in sonem Tutorial zu bewegten Bildern...fast der ganze ode kommt daher

einziges waswir daran modifiziert haben is das mit den mehreren Bällen und der Schwerkrafteffekt...und die Spur die gezogen wird (Zeile 75-77 so wie ich das sehe...bin da noch nich so ganz drin in java ;) )
 

Marco13

Top Contributor
Falls das "getGraphics" in dem Tutorial stand, dann schmeiß das Tutorial weg und schick dem Verfasser eine Briefbombe. Ansonsten ... in der paint-Methode sollte NUR gezeichnet werden. Außerdem ist es ratsam, nicht die paint-Methode des Frames zu überschreiben. Und wenn du es machst, solltest du am Anfang super.paint(g); aufrufen. Aber eigentlich sollte der Ball lieber von einem JPanel gezeichnet werden, dessen paintComponent-Methode geeignet überschrieben ist (d.h. dort wird dann als erstes super.paintComponent(g) aufgerufen). Hm. Im Moment wird eben der Event-Dispatch-Thread für etwas mißbraucht, was eigentlich von einem eigenen Thread gemacht werden sollte (nämlich die Bewegung des Balles zu regeln).

Ignorier' das:
Code:
import java.awt.*;
import javax.swing.*;

class Ball
{
    private Point pos;
    private Point vel;
    private Color color;

    public Ball(int mx, int my)
    {
        int x = (int)(Math.random()*mx);
        int y = (int)(Math.random()*my);
        pos = new Point(x,y);

        int vx = (int)(Math.random()*10);
        vel = new Point(vx, 0);

        int r = (int)(Math.random()*255);
        int g = (int)(Math.random()*255);
        int b = (int)(Math.random()*127);
        color = new Color(r,g,b);
    }

    public Color getColor()
    {
        return color;
    }

    public Point getPosition()
    {
        return pos;
    }

    public Point getVelocity()
    {
        return vel;
    }
}

class Balls implements Runnable
{
    private Ball balls[];
    private BallPanel ballPanel;

    public Balls(int number, BallPanel ballPanel)
    {
        this.ballPanel = ballPanel;
        balls = new Ball[number];
        for (int i=0; i<balls.length; i++)
        {
            balls[i] = new Ball(ballPanel.getWidth(), ballPanel.getHeight());
        }
    }

    public void run()
    {
        while (true)
        {
            for (int i=0; i<balls.length; i++)
            {
                Point pos = balls[i].getPosition();
                Point vel = balls[i].getVelocity();

                int newX = pos.x + vel.x;
                int newY = pos.y + vel.y;

                if (newY >= ballPanel.getHeight())
                {
                    newY = ballPanel.getHeight()-(newY-ballPanel.getHeight());
                    vel.y = -vel.y;
                }
                else if (newY <= 0)
                {
                    newY = -newY;
                    vel.y = -vel.y;
                }
                pos.y = newY;

                if (newX >= ballPanel.getWidth())
                {
                    newX = ballPanel.getWidth()-(newX-ballPanel.getWidth());
                    vel.x = -vel.x;
                }
                else if (newX <= 0)
                {
                    newX = -newX;
                    vel.x = -vel.x;
                }
                pos.x = newX;
                vel.y -= 1;
            }
            ballPanel.repaint();
            try
            {
                Thread.sleep(20);
            }
            catch (InterruptedException e)
            {
            }
        }
    }

    public int getNumBalls()
    {
        return balls.length;
    }

    public Ball getBall(int index)
    {
        return balls[index];
    }

}


class BallPanel extends JPanel
{
    private Balls balls;

    public void setBalls(Balls balls)
    {
        this.balls = balls;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if (balls == null)
        {
            return;
        }
        for (int i=0; i<balls.getNumBalls(); i++)
        {
            Ball b = balls.getBall(i);
            Point p = b.getPosition();
            Color c = b.getColor();
            g.setColor(c);
            g.fillOval(p.x, getHeight()-p.y, 20, 20);
        }
    }
}



class BallTest extends JFrame
{
    public static void main(String args[])
    {
        new BallTest();
    }

    public BallTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 600);

        BallPanel ballPanel = new BallPanel();

        getContentPane().setLayout(new GridLayout(1,1));
        getContentPane().add(ballPanel);

        setVisible(true);

        Balls balls = new Balls(25, ballPanel);
        ballPanel.setBalls(balls);
        new Thread(balls).start();
    }

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jxhnny.lpz bouncing Ball (Brick-Breaker-Game) Java Basics - Anfänger-Themen 1
Jxhnny.lpz bouncing ball / abprallender Ball Java Basics - Anfänger-Themen 11
K BlueJ Ball an Rand Reflektieren Java Basics - Anfänger-Themen 2
dome385 Ball Ball Kollision physikalisch korrekt Java Basics - Anfänger-Themen 5
A Breakout-Spiel , Ball mit Platten abprallen lassen Java Basics - Anfänger-Themen 1
A Ball kollidiert nicht mit Rand Java Basics - Anfänger-Themen 5
J Ball (unendlich) Java Basics - Anfänger-Themen 12
A Bouncing Ball bis er ruht Java Basics - Anfänger-Themen 6
T Processing: Quecksilberartiger Ball Java Basics - Anfänger-Themen 2
J Ball->Wand Kollision - Ball bleibt an Decke und Boden hängen Java Basics - Anfänger-Themen 2
K Animation: Ball fällt herunter Java Basics - Anfänger-Themen 2
J Das schöne Bouncing Ball Beispiel. Java Basics - Anfänger-Themen 20
G Ball-Bewegung Java Basics - Anfänger-Themen 19
F Ball soll auf Mausklick farbe ändern. Java Basics - Anfänger-Themen 10
Soloeco JList/DefaultListModel: Wie kann ich ein Panel hinzufügen? Java Basics - Anfänger-Themen 1
P Herausfinden, auf welchem Panel des CardLayouts man gerade ist? Java Basics - Anfänger-Themen 12
CptK Interface 2 von einander unabhängige Frames mit Panel gleichzeitig nutzen Java Basics - Anfänger-Themen 66
O Klappt nicht: Ein Panel neu zeichnen Java Basics - Anfänger-Themen 3
L Panel verkleinert sich unerklärlicherweise Java Basics - Anfänger-Themen 7
N Mehrere Forms auf einem Panel Java Basics - Anfänger-Themen 6
M Panel erstellen, welches ein Control erhält. Ausgabe soll über einen Stream erfolgen. Java Basics - Anfänger-Themen 0
J Panel auf Hintergrund Java Basics - Anfänger-Themen 5
J Panel und Menü Java Basics - Anfänger-Themen 6
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
D Hintergrund jpg auf Panel Java Basics - Anfänger-Themen 3
D Bild zum Panel hinzufügen Java Basics - Anfänger-Themen 8
A Frage zu einer Methode - Panel arbeitet nicht ordnungsgemäß Java Basics - Anfänger-Themen 2
F Neues Panel und Button unsichtbar Java Basics - Anfänger-Themen 10
D Panel sichtbar/unsichtbar machen im ActionListener Java Basics - Anfänger-Themen 3
S Image in Panel laden Java Basics - Anfänger-Themen 12
D Panel von unten herausfahren Java Basics - Anfänger-Themen 2
S mehrere Rechtecke in ein Panel Java Basics - Anfänger-Themen 2
L panel verschmiert beim draggen! Java Basics - Anfänger-Themen 2
J Panel + Label anzeigen - Ich kriege es nicht hin Java Basics - Anfänger-Themen 3
S Swing, Gridbaglayout Panel in Panel;funzt nicht!! Java Basics - Anfänger-Themen 3
S Swing, Panel über Hintergrundbild!! Java Basics - Anfänger-Themen 6
C Panel und Label überdecken sich Java Basics - Anfänger-Themen 2
J JLabels in Panel Aktualisieren Java Basics - Anfänger-Themen 5
H Panel in Variable setzen möglich? Java Basics - Anfänger-Themen 10
M Spezielles Panel fade in / out Java Basics - Anfänger-Themen 5
C Panel Hintergrundfarbe per AdjustmenListenmer ändern Java Basics - Anfänger-Themen 4
D GUI: Panel in Panel laden Java Basics - Anfänger-Themen 10
R Eingefärbtes Panel wird in Frame nicht angezeigt Java Basics - Anfänger-Themen 10
eLogic Panel hinzufügen Java Basics - Anfänger-Themen 4
Nic.o Panel während Ladevorgang einblenden Java Basics - Anfänger-Themen 12
B PacMan: Panel aktualisieren Java Basics - Anfänger-Themen 2
D Eingabe aus Dialog, Ergebnis an Panel Java Basics - Anfänger-Themen 2
Z JFileChooser/ Panel + Menüproblem Java Basics - Anfänger-Themen 3
J GridLayout auf Panel zentrieren? Java Basics - Anfänger-Themen 2
G Aus eigenem Panel dieses Löschen Java Basics - Anfänger-Themen 2
J Panel-übergreifende Kommunikation Java Basics - Anfänger-Themen 3
M Panel ersetzen funktioniert nicht Java Basics - Anfänger-Themen 2
M BorderLayout zickt! Ein Panel versteckt das andere! Java Basics - Anfänger-Themen 6
K Panel fixieren und nicht zentrieren Java Basics - Anfänger-Themen 2
F Zeichnen auf einem Panel Java Basics - Anfänger-Themen 2
N Panel entfernen Java Basics - Anfänger-Themen 2
B Zugriff auf JTextPane in einem anderen Panel Java Basics - Anfänger-Themen 2
H TabbedPane: wie schalte ich auf ein bestimmtes panel? Java Basics - Anfänger-Themen 2
G Bild in Panel oder canvas einfügen Java Basics - Anfänger-Themen 3
kulturfenster Panel in Frame integrieren Java Basics - Anfänger-Themen 5
H Paint Methode malt nicht im Panel Java Basics - Anfänger-Themen 4
J Probleme mit Visual Editor Komponenten auf Panel legen Java Basics - Anfänger-Themen 4
M Panel ausgrauen (disable) Java Basics - Anfänger-Themen 2
K Component vom einem Panel löschen ? Java Basics - Anfänger-Themen 14
C Panel wird nicht übermalt Java Basics - Anfänger-Themen 6
P Swing Textarae so groß wie Panel? Java Basics - Anfänger-Themen 2
G Rekursives aufrufen führt zu StackOverflowError Panel durchl Java Basics - Anfänger-Themen 5
T JMenuItems werden von Komponente in Panel verdeckt Java Basics - Anfänger-Themen 11
G Auf ein Panel malen Java Basics - Anfänger-Themen 16
D Event mit n-Button8s) von einem Panel Java Basics - Anfänger-Themen 9
Z Wie übergebe ich einer MyFrame-Klasse ein Panel? Java Basics - Anfänger-Themen 8
A g=panel.getGraphics() im Thread => Nullpointer Java Basics - Anfänger-Themen 9
S Bilder bleiben auf einem Panel nicht gezeichnet Java Basics - Anfänger-Themen 6
L Java Control Panel Java Basics - Anfänger-Themen 5
A Swing Schriftfarbe für komplettes Panel ändern Java Basics - Anfänger-Themen 2
G Panel Java Basics - Anfänger-Themen 4
B Kann man mit XMl ein Panel erstelln Java Basics - Anfänger-Themen 2
R Einfügen einer eigenen methode in ein Panel Java Basics - Anfänger-Themen 5
E Komponenten auf Panel positionieren Java Basics - Anfänger-Themen 3
G aus Thread auf Panel zeichnen Java Basics - Anfänger-Themen 22
G Text in Panel anordnen Java Basics - Anfänger-Themen 6
M Ein Panel in ein Panel laden Java Basics - Anfänger-Themen 3
S Graphic im Panel änder durch JSlider Java Basics - Anfänger-Themen 2
T Panel entfernen Java Basics - Anfänger-Themen 4
T Panel entfernen, neues hinzufügen Java Basics - Anfänger-Themen 2
A Probleme mit Panel und GUI Java Basics - Anfänger-Themen 4
D Warum färbt er das unter Panel nicht ein? Java Basics - Anfänger-Themen 3
V Panel durchsichtig machen Java Basics - Anfänger-Themen 4
D Desktop auf nem Panel Java Basics - Anfänger-Themen 6
B Panel bei Mausklick färben Java Basics - Anfänger-Themen 3
S Keyevent in Panel Java Basics - Anfänger-Themen 5
C Add / Remove Panel Java Basics - Anfänger-Themen 2
C zweites Panel auf Knopfdruck anzeigen Java Basics - Anfänger-Themen 2
O größe von panel mit gridlayout Java Basics - Anfänger-Themen 9
G Panel in Methode erneut aufrufen Java Basics - Anfänger-Themen 5
B Panel mit Radiobuttons als eigene Klasse Java Basics - Anfänger-Themen 4
G aktueller Panel, der in BorderLayout.SOUTH angeordnet ist Java Basics - Anfänger-Themen 11
A Panel und getContentPane() ? Java Basics - Anfänger-Themen 2
S panel leeren Java Basics - Anfänger-Themen 2
S Panel / setbounds Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben