Avatar billede newbie_dk Nybegynder
24. januar 2005 - 13:54 Der er 7 kommentarer og
1 løsning

Pause en forløkke, til brug i JPanel..

Jeg har en mindre udfordring her, som jeg ikke umiddelbart kan få løst. Sagen er den at jeg vil lære lidt swing, så jeg er gået igang med at lave små spil (man skal kravle før man kan gå). Jeg er gået igang med at lave pong, som jo er et meget simpelt spil.

Problemet er det at bolden jo selv skal kunne bevæge sig; fint nok tænker jeg, det kan en while løkke vel klare for mig. Jeg har lavet klasser og metoder til at få det hele til at gå op i en højere enhed. Lige nu kan bolden flyve rundt, men kun når spilleren bevæger sit pongbat, hvilket jo ikke er optimalt..

Problemet med while løkken er bare at den laver udregningerne for hurtigt til at det bliver vist på skærmen, så jeg tænkte om man kunne fremtvinge en pause på måske et lille sekund eller lign i den for løkke. Jeg har leget lidt med følgende:

while(pongBall.ballX()>20)
{
    repaint();

    pongBall.setX((int)pongBall.ballX()-4);
    System.out.println(pongBall.ballX());

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Men den viser stadig ikke hvad der sker på skærmen. Jeg har i metoden lavet en system.out.println med boldens x,y værdier, og den regner det fint nok ud med den pågældende forsinkelse imellem hver udregning, men det bliver bare ikke vist på skærmen.
Avatar billede arne_v Ekspert
24. januar 2005 - 14:01 #1
Du skal nok have startet en separat tråd til at opdatere/vente.

Jeg lavede engang dette her eksempel:

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;

public class DynNum extends JFrame implements ActionListener {
  private JTextArea txt;
  private JButton btn;
  public DynNum() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      getContentPane().setLayout(new GridLayout(2, 1));
      txt = new JTextArea();
      getContentPane().add(txt);
      btn = new JButton("Start");
      btn.addActionListener(this);
      getContentPane().add(btn);
      pack();
  }
  public void addNum(int n) {
      txt.setText(txt.getText() + " " + n + "\r\n");
      pack();
  }
  public void actionPerformed(ActionEvent ev) {
      if (ev.getSource() == btn) {
        T t = new T(this);
        t.start();
      }
  }
  public static void main(String[] args) {
      DynNum f = new DynNum();
      f.show();
  }
}

class T extends Thread {
  private DynNum dn;
  public T(DynNum dn) {
      this.dn = dn;
  }
  public void run() {
      Random rng = new Random();
      for(int i = 0; i < 10; i++) {
        dn.addNum(rng.nextInt(100));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
      }
  }
}

(det flytter ikke noget men tilføjer til et text area, men princippet er det samme)
Avatar billede newbie_dk Nybegynder
24. januar 2005 - 14:22 #2
Den regner jo fint nok ud, og venter også. Den opdaterer bare ikke, og jeg tror at det har noget med min repainter at gøre, da den tegner bolden ligeså snart den rammer et af battene...
Avatar billede supa Nybegynder
24. januar 2005 - 15:47 #3
Jeg har næsten samme problem, men dette gælder dog en JProgressBar i en JFrame.. Den opdatere ikke løbende, men derimod så sætter den alt det der skal vises på JFramen når den er 100% færdig, og jeg vil gerne have at den viser den løbende da det er lidt sjovere samt at det er til at følge med i hvor langt den er kommet..

Jeg vil gerne undgå at bruge Thread..
Avatar billede arne_v Ekspert
24. januar 2005 - 15:50 #4
Det kan du så vidt jeg ved ikke.
Avatar billede arne_v Ekspert
24. januar 2005 - 15:50 #5
Endnu et eksempel:

import java.awt.*;
import java.io.*;

import javax.swing.*;

public class CopyProgressThread extends JFrame {
    public JProgressBar pbar;
    public CopyProgressThread() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        pbar = new JProgressBar();
        getContentPane().add(pbar, BorderLayout.CENTER);
        pack();
    }
    public static void main(String[] args) {
        CopyProgressThread cp = new CopyProgressThread();
        cp.show();
        CopyThread cpthread = new CopyThread("C:\\z.1", "C:\\z.2", cp.pbar);
        cpthread.start();
    }
}

class CopyThread extends Thread {
    private String from;
    private String to;
    private JProgressBar  pbar;
    public CopyThread(String from, String to, JProgressBar pbar) {
        this.from = from;
        this.to = to;
        this.pbar = pbar;
    }
    public void run() {
        pbar.setMaximum((int)(new File(from)).length());
        pbar.setValue(0);
        pbar.setStringPainted(true);
        try {
            InputStream is = new FileInputStream(from);
            OutputStream os = new FileOutputStream(to);
            int total = 0;
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
                os.write(b, 0, n);
                total += n;
                pbar.setValue(total);
            }
            is.close();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede repulse Nybegynder
24. januar 2005 - 16:53 #6
Du/I kan lige så få lært det med tråde - i kommer til at bruge dem hvis i vil lave noget seriøst! Tror også i vil bliv glade for det i længden :)
Avatar billede newbie_dk Nybegynder
24. januar 2005 - 17:02 #7
repulse:

det er også den konklusion jeg er nået frem til =)
Avatar billede arne_v Ekspert
25. februar 2005 - 22:01 #8
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester