Archief - Java thread probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Rubax

Legacy Member
Beste,

Voor mijn studie ICT heb ik de opdracht gekregen om een Brick Breakout te maken. Tijdens het programmeren ben ik op de volgende fout gekomen; mijn brickBal beweegt niet, ik zie het probleem niet aangezien mijn thread toch gestart wordt.

Iemand die het probleem kan oplossen?

Alvast bedankt!!
Vriendelijke groeten


CODE:

package project_breakout;

import java.awt.event.*;
import javax.swing.BorderFactory;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Project_BreakOut extends JFrame {

public static void main(String[] args) {
//Maken van het frame (JFrame object)
JFrame BrickVeld = new Project_BreakOut();
BrickVeld.setSize(700, 680);
BrickVeld.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BrickVeld.setTitle("Brick Break");
BrickVeld.setContentPane(new BrickGUI());
BrickVeld.setVisible(true);
}
}

class BrickGUI extends JPanel {

private BrickPeddel modelPeddel;
private ArrayList<BrickBrick> modelBrickLijst;
private BrickBal modelBal;
private JPanel view;
private JPanel controller;

public BrickGUI() {
setLayout(new BorderLayout());

modelPeddel = new BrickPeddel(330, 600, 50, 10);
modelBrickLijst = new ArrayList();
modelBal = new BrickBal(modelPeddel, modelBrickLijst, view);





view = new BrickView(modelPeddel, modelBrickLijst, modelBal);
controller = new BrickController(modelPeddel, modelBrickLijst, modelBal, view);



add(view, BorderLayout.CENTER);
add(controller, BorderLayout.SOUTH);
}
}

class BrickPeddel {

private int xPos, yPos, breedte, hoogte;

public BrickPeddel(int xPos, int yPos, int breedte, int hoogte) {

this.xPos = xPos;
this.yPos = yPos;
this.breedte = breedte;
this.hoogte = hoogte;
}

public int getxPos() {
return xPos;
}

public int getyPos() {
return yPos;
}

public int getBreedte() {
return breedte;
}

public int getHoogte() {
return hoogte;
}

public void naarLinks() {
if (this.xPos <= 0) {
xPos += 0;
} else {
xPos -= 5;
}
}

public void naarRechts() {

if (this.xPos >= 635) {
xPos += 0;
} else {
xPos += 5;
}
}

public void setxPos(int xPos) {
this.xPos = xPos;
}

public void teken(Graphics g) {
g.setColor(Color.black);
g.fillRect(xPos, yPos, breedte, hoogte);
}
}

class BrickBrick {

private int xPos;
private int yPos;
private int breedte;
private int hoogte;
private int hitCount;

public BrickBrick(int xPos, int yPos) {
this.xPos = xPos;
this.yPos = yPos;
this.breedte = 50;
this.hoogte = 20;
this.hitCount = 1;
}

public int getHitCount() {
return this.hitCount;
}

public int getXPos() {
return this.xPos;
}

public int getYPos() {
return this.yPos;
}

public int getBreedte() {
return this.breedte;
}

public int getHoogte() {
return this.hoogte;
}

public void teken(Graphics g) {
g.setColor(Color.LIGHT_GRAY);
g.fillRect(this.xPos, this.yPos, this.breedte, this.hoogte);
g.setColor(Color.YELLOW);
g.fillRect(this.xPos + 1, this.yPos + 1, this.breedte - 2, this.hoogte - 2);
}

public void verlaagHitCount() {
this.hitCount -= 1;
}
}

class BrickBal extends Thread {

private int xPos;
private int yPos;
private int straal;
private int dx;
private int dy;
private boolean doorgaan;
private Graphics g;
private BrickPeddel modelPeddel;
private ArrayList<BrickBrick> modelBrickLijst;
private JPanel view;

public BrickBal( BrickPeddel modelPeddel, ArrayList<BrickBrick> modelBrickLijst, JPanel view) {
this.modelPeddel = modelPeddel;
this.modelBrickLijst = modelBrickLijst;
this.view = view;

this.dx = 1;
this.dy = -3;
doorgaan = true;
this.straal = 7;
this.xPos = (modelPeddel.getxPos() + modelPeddel.getBreedte() / 2 - this.straal);
this.yPos = (modelPeddel.getyPos() - 2 * this.straal);
}

public boolean getDoorgaan() {
return this.doorgaan;
}

@Override
public void run() {
while (this.doorgaan) {

view.repaint();
slaap(10);
verplaats();
}
}

public void nuStoppen() {
this.doorgaan = false;
}

public void setDoorgaan(boolean doorgaan) {
this.doorgaan = doorgaan;
}

public void setG(Graphics g) {
this.g = g;
}

public void slaap(int millisec) {
try {
Thread.sleep(millisec);
} catch (InterruptedException e) {
}
}

public void teken(Graphics g, Color kleur) {
g.setColor(kleur);
g.fillOval(this.xPos, this.yPos, 2 * this.straal, 2 * this.straal);
}

public void verplaats() {
xPos += this.dx;
yPos += this.dx;
}
}

class BrickController extends JPanel {

private BrickPeddel modelPeddel;
private BrickBal modelBal;
private ArrayList<BrickBrick> modelBrickLijst;
private JPanel view;

public BrickController(BrickPeddel modelPeddel, ArrayList<BrickBrick> modelBrickLijst, BrickBal modelBal, JPanel view) {
this.modelPeddel = modelPeddel;
this.modelBrickLijst = new ArrayList();
this.modelBal = modelBal;
this.view = view;


this.setFocusable(true);
addKeyListener(new ToetsenbordHandler());

}

class ToetsenbordHandler extends KeyAdapter {

public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
modelPeddel.naarRechts();
if (modelBal == null) {
modelBal = new BrickBal(modelPeddel, modelBrickLijst, view);
modelBal.start();
System.out.println("test");
}
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
modelPeddel.naarLinks();
modelBal = null;
}
view.repaint();

}
}
}

class BrickView extends JPanel {

private BrickPeddel modelPeddel;
private ArrayList<BrickBrick> modelBrickLijst;
private BrickBal modelBal;

public BrickView(BrickPeddel modelPeddel, ArrayList<BrickBrick> modelBrickLijst, BrickBal modelBal) {
this.modelPeddel = modelPeddel;
this.modelBrickLijst = new ArrayList();
this.modelBal = modelBal;

for (int x = 25; x <= 625; x += 50) {
for (int y = 25; y <= 225; y += 20) {
this.modelBrickLijst.add(new BrickBrick(x, y));
}
}
}

public void paintComponent(Graphics g) {
super.paintComponent(g);


modelPeddel.teken(g);
modelBal.teken(g, Color.BLACK);

for (BrickBrick blok : this.modelBrickLijst) {
if (blok.getHitCount() > 0) {
blok.teken(g);
}
}
}
}

SharkyXTS

Legacy Member
Alvast een tip, gebruik ExecutorServices in plaats van zelf een thread te gaan extenden en starten. Gebruik specifiek deze en laat BrickBall extenden van Runnable in plaats van Thread. Dan hoef je in plaats van modelBall.start() , executorService.scheduleAtFixedRate( modelBall, 0, 10, MS ) te doen. Kan je meteen ook die afgrijselijke slaap(10) eruit halen. Maakt je code bovendien makkelijker om te debuggen. Niet vergeten om je executorservice aan het einde van je programma te stoppen via ExecutorService#shutdown.

EDIT: Ugh, je BrickBall zou eigenlijk niks te maken mogen hebben met de manier waarop je je GUI tekent. Je rendering thread moet los staan van je domein representatie. Nu heb je een BrickBall klasse die beide combineert. Eigenlijk zou je BrickBall klasse enkel zijn positie en visualisatie-eigenschappen bevatten (niet overerven van Thread of Runnable m.a.w.).

Daarnaast kan je de custom rendering thread er waarschijnlijk uithalen (ik ken niks van Swing) door in je keyPressed method gewoon een invalidate van je view te doen. Ik ga er vanuit dat Swing sowieso al je key-events oproept uit de GUI-thread en dan hoef je enkel een invalidate te doen nadat je de positie van je BrickBall hebt geupdate.

Rubax

Legacy Member
Alvast bedankt, ik ga het meteen testen.
Ik hoop dat het nadien werkt!

groeten
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan