Endlosschleife verhindert das Schließen des Fensters

Status
Nicht offen für weitere Antworten.

Rammstein

Mitglied
Hallo Leute 🙂
Ich habe bereits in Google und auch hier bereits nach Lösungen gesucht, allerdings keine gefunden.
Ich habe folgendes Problem: Ich habe(wie unten gepostet) einen Java-Code, indem in Graphics ne Endlosschleife ist.
Nunja, der WindowAdapter ist ja eigentlich fürs Schließen zuständig.
Wenn man aber nun eine ENdlosschleife (wie unten ) einbaut... klappt der halt nicht !
Und ich wollte das Fenster mit dieser Endlosschleife beenden. Hat jemand eine (einfache^^) Lösung 🙂 ?
Ich wäre sehr verbunden !
Code:
import java.awt.*;
import java.awt.event.*;
  public class Test extends Frame
  {
  public class WAdapter extends WindowAdapter
    {
    public void widowclosing (WindowEvent e)
      {
      dispose ();
      System.exit(0);
      }
    }

  public void paint (Graphics g)
    {
	  boolean running = true;
	  int i=0;
	  
		while(running)
		{
                // Hier wird irgendetwas gemacht
		}
    }


 public static void main (String args[])
      {
      Test fenster=new Test();//Hauptfenster
      fenster.setVisible (true);
      fenster.setSize(700,800);
      fenster.addWindowListener(fenster.new WAdapter());
      }
    
  }

Danke im Vorraus!
 
Du müsstest das ganze in zwei verschiedenen Threads ablaufen lassen. Ob das ganze mit Java einfacher geht weiß ich allerdings nicht.
 
In einer paint Methode schreibt man nie eine Endlosschleife!!!! Die muss so schnell wie möglich beendet werden.
 
Mach die Endlos schleife irgendwo in einer Anderen Methode und zeichne dort in ein Image und dieses Image zeichnest du dann mit der paint Methode auf den Bildschirm.


In der Methode kannst du dann ja nach jedem Schleifen durchlauf repaint aufrufen.
 
Mach die Endlos schleife irgendwo in einer Anderen Methode und zeichne dort in ein Image und dieses Image zeichnest du dann mit der paint Methode auf den Bildschirm.


In der Methode kannst du dann ja nach jedem Schleifen durchlauf repaint aufrufen.

Also ich bin in dem Thema nciht ganz so begabt... aber ich versteh das ungefähr so:
Code:
import java.awt.*;
import java.awt.event.*;
  public class Test extends Frame
  {
  public class WAdapter extends WindowAdapter
    {
    public void widowclosing (WindowEvent e)
      {
      dispose ();
      System.exit(0);
      }
    }

  public void paint (Graphics g)
    {
	  boolean running = true;
	  int i=0;
	  
         AnstattSchleife();
    }

 public void AnstattSchleife(){
                                       }

 public static void main (String args[])
      {
      Test fenster=new Test();//Hauptfenster
      fenster.setVisible (true);
      fenster.setSize(700,800);
      fenster.addWindowListener(fenster.new WAdapter());
      }
    
  }



Nur von "repaint" habe ich noch nie etwas gehört ! 😀
Könntest du das etwas erläutern 🙂 ?
Un dich weiß auch nciht ob du irgendwelche Variablen durchgeben willst... Deswegen habe ich einfahc mal "void" gesetzt 😉
 
So als kleines Beispiel:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

   private static final int HEIGHT = 500;
   private static final int WIDTH = 200;

   public Main() {
      init();
   }

   private void init() {
      final JFrame frame = new JFrame("The bouncing Point");
      frame.setSize(WIDTH, HEIGHT);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      PointPanel pp = new PointPanel(WIDTH, HEIGHT);
      frame.getContentPane().add(pp);

      Thread thread = new Thread(new PointThread(pp));
      thread.start();
      frame.setVisible(true);
   }

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

   public static class PointThread implements Runnable {

      private PointPanel pointPanel;

      private int speed = 2;
      private boolean upwards;

      public PointThread(PointPanel panel) {
         this.pointPanel = panel;
      }

      @Override
      public void run() {
         while (true) {
            int height = pointPanel.getHeight();

            Rectangle oldRect = pointPanel.getRectabgle();
            // change up/down
            if (oldRect.getCenterY() < (height / 4)) {
               upwards = false;
            } else if (!upwards && oldRect.getCenterY() > height - 20) {
               upwards = true;
            }
            Point oldLocation = oldRect.getLocation();

            Point newLocation;
            if (upwards) {
               newLocation = new Point(oldLocation.x, oldLocation.y - speed);
            } else {
               newLocation = new Point(oldLocation.x, oldLocation.y + speed);
            }
            Rectangle newrect = new Rectangle(newLocation, oldRect.getSize());

            pointPanel.updatePoint(newrect);
            try {
               // 50 Hz
               Thread.sleep(10);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
      }
   }

   @SuppressWarnings("serial")
   public static class PointPanel extends JPanel {

      final Dimension POINT_SIZE = new Dimension(20, 20);

      // actual point
      Rectangle rect = new Rectangle(new Point(250, 400), new Dimension(20, 20));

      public PointPanel(int width, int height) {
         super();
         // start point (middle of frame bottom)
         rect = new Rectangle(new Point(width / 2 - POINT_SIZE.width / 2, height - POINT_SIZE.height), POINT_SIZE);
      }

      @Override
      public void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.setColor(Color.RED);
         g.fillOval(rect.x, rect.y, rect.width, rect.height);
      }

      public void updatePoint(Rectangle newRect) {
         Rectangle updateArea = newRect.union(rect);
         rect = newRect;
         // repaint the specific area
         repaint(updateArea.x, updateArea.y, updateArea.width + 1, updateArea.height + 1);
      }

      public Rectangle getRectabgle() {
         return this.rect;
      }
   }
}

Gezeichnet wird in der paintComponent(G) --> Swing equivalent zu paint()
das repaint finder in der updatePoint-Methode statt
Die Endlosschleife in einem separaten Thread, welcher das Panel updatet

so in der kürze..
 
mal auf das Essentielle zusammengewurstelt:
Java:
//import ...
public class Main {

   public Main() {
      init();
   }

   private void init() {
	   // mach ein Frame
      final JFrame frame = new JFrame("The bouncing Point");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      // Mach ein Panel im Frame
      PointPanel pp = new PointPanel();
      frame.getContentPane().add(pp);

      // Thread mit endlosschleife
      Thread thread = new Thread(new PointThread(pp));
      thread.start();
      frame.setVisible(true);
   }

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

   public static class PointThread implements Runnable {

      private PointPanel pointPanel;

      public PointThread(PointPanel panel) {
         this.pointPanel = panel;
      }

      @Override
      public void run() {
    	  // Endlosschleife
         while (true) {
        	 // update das Panel
            pointPanel.updatePoint();
         }
      }
   }

   @SuppressWarnings("serial")
   public static class PointPanel extends JPanel {

      public PointPanel() {}

      @Override
      public void paintComponent(Graphics g) {
         super.paintComponent(g);
         // malen
      }

      public void updatePoint() {
    	  //zeichne das Areal neu
         repaint(x, y, width , height);
      }
   }
}
 
Ob Rammstein wohl noch die Feinheiten und vor allem
die Denkweise, die bei Arbeiten mit dem EDT (event dispatch Thread)
nötig ist, mitbekommt? 😀
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben