JFrame alle 20 millisekunden aktualisieren

wahed132

Mitglied
hallo alle zusammen
hab ein kleines problem und hoffe es ist wirklich so klein wie ich denke^^
also
ich hab ein JFrame und dadrinne ein button.
dieser botten soll beim klick um 130 pixel nach rechts verschoben werden, aber nach jedem pixel soll der 20 millisekunden warten und dann weiterlaufen, sodas es am ende aussieht als ob es nach rechts gleiten würde.
dafür müsste ich glaube ich nach jedem schritt, dass der button macht den frame aktuallisieren.
und das ist es woran ich gescheitert bin ^^
vieleicht gibts auch eine elegantere lösung aber das ist die einzige die mir eingefallen ist.

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class test extends JFrame implements Runnable {
  // Anfang Attribute
  private JButton jButton1 = new JButton();
  // Ende Attribute
  int m=70;

  public test(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jButton1.setBounds(33, 32, 49, 33);
    jButton1.setText("jButton1");
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public void jButton1_ActionPerformed(ActionEvent evt) {
      Thread th = new Thread (this);
      // Starten des Threads
      th.start ();
      while(m<200){

       jButton1.setBounds(m, 32, 49, 33);
       m++;
       try
            {
                  // Stoppen des Threads für in Klammern angegebene Millisekunden
                  Thread.sleep (20);
                    this.repaint();
            }
            catch (InterruptedException ex)
            {
                  // do nothing
            }

       }


    // TODO hier Quelltext einfügen
  }
  
  public void run ()
  {
  }


  public static void main(String[] args) {
    new test("test");
  }
}

hoffe einer kann mir helfen

MFG

wahed132
 
wenn du den erzeugten Thread schlafen legen willst, dann solltest du auch auf diesem die sleep(...) Methode aufrufen:
Ändere mal
Code:
Thread.sleep (20);
in
Code:
th.sleep(20);
 
jop hab ich aber das geht dann immernoch direkt 130 pixel nach rechts
ich würd das gerne so machen das es nach jedem pixel 20 millisekunden wartet und das es dann den frame aktualisiert, sodas es aussieht als ob der button nach rechts verschoben wird und nicht einfach dahingebeamt wird:p.
der tread schläft ja auch nach jedem durschlauf der whileschleife, man merkt das es langsammer geworden ist. aber man sieht nicht wie es nach rechts gleitet und ich glaub es liegt dadran das der frame nicht aktuallisiert wird.
ich bräuchte also sowas ähnliches wie ein repaint(); oder sowas.
 
Habe mit deinen Code gespielt- leider ohne Erfolg.
Es sieht so aus, dass Applikation mit Thread so beschäftigt ist, sodass keine innerliche Kräfte der Buttons keine Wirkung mehr haben, gedrücktes Knopf nach oben zu zeichnen. Noch eine unschöne Sache für Java...
 
Der Aufruf von this.repaintn ist nur ein "Vorschlag" neu zu zeichnen. Sobald dann genug Zeit ist um in Ruhe neu zu Zeichnen führt Java dies auch aus. Rufe also anstatt this.repaint lieber this.paint(this.getGraphics()) auf. Dieser Aufruf veranlasst ein sofortiges neu Zeichnen.

Besser wäre es allerdings noch, das verschieben des Buttons in einen eigenen Thread auszulagern. Somit bleibt der main-Thread frei und hat Zeit neuzuzeichnen.

Hoffe das ist alles richtig so.

Gruß sony2
 
Hallo,

@washed132
Ich bitte dich, doch etwas auf deine Groß- und Kleinschreibung zu achten.

MFG

Sascha
 
Hier bitte schön:
Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class blub extends JFrame{
	JPanel pnlMain ;
	JButton btnStep;
	
	int m = 50;
	public blub() 
	{
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		pnlMain = new JPanel();
		pnlMain.setLayout(null);
		btnStep = new JButton("Step");
		btnStep.setBounds(50, 50, 100, 100);
		btnStep.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				new stepButton(btnStep).start();
			}
		});
		pnlMain.add(btnStep);
		this.add(pnlMain);
	}
	
	public class stepButton extends Thread
	{
		JButton tmpButton;
		public stepButton(JButton param) 
		{
			tmpButton = param;
		}
		@Override
		public void run() {
			while(m<400)
			{
				btnStep.setBounds(m, 50, 100, 100);
				try {
					Thread.sleep(20);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				m+=20;
			}
			super.run();
		}
	}
	
	
	public static void main(String[] args) {
		blub start = new blub();
		start.setSize(500,500);
		start.setVisible(true);
	}
}
 

Neue Beiträge

Zurück