2D-Grafik Bild wird nicht neu gezeichnet

andi11

Mitglied
Hallo zusammen,

im folgenden Programm soll nach Betätigen eines Buttons ein Ball vom Bildschirmrand in die Mitte laufen.
Das funktioniert auch soweit, wenn ich den Ablauf automatisch starten lasse, d.h. nicht über den Button in der Methode "public void actionPerformed(ActionEvent e)".
Dazu lege den Aufruf der Methode "Bewegen()" beispielsweise unter "public void start()" ab.

Lege ich den Aufruf "Bewegen()" allerdings wie im Beispiel unten unter "public void actionPerformed(ActionEvent e)" ab, bleibt der Ball am linken Bildschirmrand liegen und wird nicht neu gezeichnet.
Dennoch arbeitet das Programm im Hintergrund und berechnet jeweils die nächste Position korrekt. Diese ist über die Konsole sichtbar, da ich die aktuelle Position in einer Klasse ausgeben lasse.
Wo ist der Fehler?


Java:
package Pack1;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;


public class Start extends JApplet implements ActionListener {
   
   
   private Weg Weg=new Weg();
   
   
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen;
   
   
   public void init()
   {
     

     Import Import = new Import();
     Import.TXTImport();
     
     setSize(800,800);
     JPanel MainPannel = new JPanel();
     MainPannel.setLayout(null);
     getContentPane().add(MainPannel);
     MainPannel.setBounds(0, 0, 800, 800);
     setVisible(true);
     
     VonRechts = new JButton("Von rechts");
     VonLinks1 = new JButton("Von links1");
     VonLinks2 = new JButton("Von links2");
     Schliessen = new JButton("Schließen");
     
     MainPannel.add(VonRechts);   
     MainPannel.add(VonLinks1);
     MainPannel.add(VonLinks2);
     MainPannel.add(Schliessen);     

     int PosxStart = 50;
     int PosyStart = 750;
     int BreiteButton = 160;
     int HoeheButton = 40;
     int delta = 20;
     
     VonRechts.setBounds(PosxStart, PosyStart, BreiteButton, HoeheButton);
     VonLinks1.setBounds(PosxStart+(BreiteButton+delta)*1, PosyStart, BreiteButton, HoeheButton);
     VonLinks2.setBounds(PosxStart+(BreiteButton+delta)*2, PosyStart, BreiteButton, HoeheButton);
     Schliessen.setBounds(PosxStart+(BreiteButton+delta)*3, PosyStart, BreiteButton, HoeheButton);

     VonRechts.addActionListener(this);
     VonLinks1.addActionListener(this);
     VonLinks2.addActionListener(this);
     Schliessen.addActionListener(this);
   }
   

   
   public void actionPerformed(ActionEvent e)
   
   {

     if (e.getSource() == VonRechts)
     {

       Pack1.GlobalVar.StartPos[0] = 700;   
       Pack1.GlobalVar.StartPos[1] = 350;
       Bewegen();

     }
     
     if (e.getSource() == VonLinks1)
     {
       System.out.println("Test");
       //Pack1.GlobalVar.StartPos[0] = 0;   
       //Pack1.GlobalVar.StartPos[1] = 350;
       
     }
     
     if (e.getSource() == VonLinks2)
     {
       System.out.println("Test");
       //Pack1.GlobalVar.StartPos[0] = 0;   
       //Pack1.GlobalVar.StartPos[1] = 350;   
     }
     
     if (e.getSource() == Schliessen)
     {
       System.exit(0);
     }   
   }
   
  public void paint( Graphics g )
   {
     super.paint(g);

     g.setColor(new Color(100,100,250));
     g.fillOval(GlobalVar.AktPos[0], GlobalVar.AktPos[1], 15, 15);
  }
   
   public void start()
   {   
     
   }
     
   public void Bewegen()
   {
     
     while (Pack1.GlobalVar.AktPos != Pack1.GlobalVar.SollPos)
     {
       Weg.NaechstePos();
       
       try
       {
         Thread.sleep(200);
         
       } catch (InterruptedException e)
       {
         System.out.println("Timer Error");
       }
       
       repaint();
     }
   }
   
}
 

Enceladus271

Bekanntes Mitglied
Wenn du die Methode "bewegen" in actionPerformed aufrufst, wird sie im Event-Dispatch-Thread ausgeführt. Das führt dazu, dass der EDT die ganze Zeit blockiert ist, und somit in dieser Zeit die Oberfläche nicht aktualisiert werden kann.

Versuch mal die Methode "bewegen" nicht direkt aufzurufen, sondern sie in einem anderen Thread auszuführen.
 

andi11

Mitglied
Hallo, erstmal vielen Dank für die Info.
Nun habe ich versucht einen neuen Thread zu erstellen, aber es läuft leider immer noch nicht (siehe Änderung unten). Ich habe eine neue Klasse MyThread extends Thread mit der Methode run() eingefügt, über die ich den Lauf starte.


Java:
package Pack1;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;


public class ProgrammStart extends JApplet implements ActionListener {
   
   //private Weg Weg=new Weg();
   MyThread MyThread = new MyThread();
   
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen;
   
   
   public void init()
   {
     
     Import Import = new Import();
     Import.TXTImport();
     
     setSize(800,800);
     JPanel MainPannel = new JPanel();
     MainPannel.setLayout(null);
     getContentPane().add(MainPannel);
     MainPannel.setBounds(0, 0, 800, 800);
     setVisible(true);
     
     VonRechts = new JButton("Von rechts");
     VonLinks1 = new JButton("Von links1");
     VonLinks2 = new JButton("Von links2");
     Schliessen = new JButton("Schließen");
     
     MainPannel.add(VonRechts);   
     MainPannel.add(VonLinks1);
     MainPannel.add(VonLinks2);
     MainPannel.add(Schliessen);     

     int PosxStart = 50;
     int PosyStart = 750;
     int BreiteButton = 160;
     int HoeheButton = 40;
     int delta = 20;
     
     VonRechts.setBounds(PosxStart, PosyStart, BreiteButton, HoeheButton);
     VonLinks1.setBounds(PosxStart+(BreiteButton+delta)*1, PosyStart, BreiteButton, HoeheButton);
     VonLinks2.setBounds(PosxStart+(BreiteButton+delta)*2, PosyStart, BreiteButton, HoeheButton);
     Schliessen.setBounds(PosxStart+(BreiteButton+delta)*3, PosyStart, BreiteButton, HoeheButton);

     VonRechts.addActionListener(this);
     VonLinks1.addActionListener(this);
     VonLinks2.addActionListener(this);
     Schliessen.addActionListener(this);
   }
   

   
   public void actionPerformed(ActionEvent e)
   
   {

     if (e.getSource() == VonRechts)
     {

       Pack1.GlobalVar.StartPos[0] = 700;   
       Pack1.GlobalVar.StartPos[1] = 350;
       MyThread.start();

     }
     
     if (e.getSource() == VonLinks1)
     {
       System.out.println("Test");
       //Pack1.GlobalVar.StartPos[0] = 0;   
       //Pack1.GlobalVar.StartPos[1] = 350;
       
     }
     
     if (e.getSource() == VonLinks2)
     {
       System.out.println("Test");
       //Pack1.GlobalVar.StartPos[0] = 0;   
       //Pack1.GlobalVar.StartPos[1] = 350;   
     }
     
     if (e.getSource() == Schliessen)
     {
       System.exit(0);
     }   
   }
   
  public void paint( Graphics g )
  {
     super.paint(g);
     g.setColor(new Color(100,100,250));
     g.fillOval(GlobalVar.AktPos[0], GlobalVar.AktPos[1], 15, 15);
  }
   
  public void start()
  {     
  }
}



-----------------------

package Pack1;

public class MyThread extends Thread
{
  private Weg Weg = new Weg();
  private ProgrammStart ProgrammStart=new ProgrammStart();
 
  public void run()
  {
   
  while (Pack1.GlobalVar.AktPos != Pack1.GlobalVar.SollPos)
  {
  Weg.NaechstePos();
   
  try
  {
  java.lang.Thread.sleep(200);
   
  } catch (InterruptedException e)
  {
  System.out.println("Timer Error");
  }
   
  ProgrammStart.repaint();
  }
  }
}
 
Zuletzt bearbeitet:

Schesam

Bekanntes Mitglied
Lass die Klasse "MyThread" mal runnable implementieren anstatt von Thread erben und starte den Thread mit new Thread(new MyThread()).start();

Wobei man dann MyThread in sowas wie MyRunnable oder so ändern sollte.
 

Enceladus271

Bekanntes Mitglied
Wenn du den Thread erzeugst, darfst du natürlich keine neue Instanz von der Hauptklasse anlegen. Dadurch hast du dann zwei Instanzen von "ProgrammStart" und der Thread aktualisiert die Falsche.

Ausgehend von deinem ersten geposteten Code musst du nur das bewegen(); durch folgendes ersetzen:
Java:
      new Thread() {
         @Override
         public void run() {
           Bewegen();
         };
       }.start();
Das sollte funktionieren.

Weiter Bemerkung am Rande:
1. Es ist besser nicht direkt in das Applet zu zeichnen. Ich würde ein JPanel dafür nehmen und dann die paintComponent statt paint überschreiben.
2. Sieh dir mal die Klasse javax.swing.Timer an. Die ist für solche Aufgaben sehr gut geeignet.
 

andi11

Mitglied
Vielen Dank, das funktioniert soweit. Das mit dem Timer habe ich ebenfalls ein wenig geändert.

Nun habe ich aber noch ein Problem.
Es gibt mehrere Button. Jeder Button gibt eine andere Startposition vor, von der aus sich der Ball in die Mitte bewegt. Ist nun der Ball in der Mitte angekommen, möchte ich einen weiteren Button drücken um einen neuen Durchlauf zu starten. Das funktioniert allerdings nicht. Nur der Button "Schließen funktioniert.


Java:
package Pack1;

import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;



public class ProgrammStart extends JApplet implements ActionListener {
   
   int [] StartPos= {0,0};
   
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen;

   private boolean Hoehenkontrolle = false;
   
   
   public void init()
   {
     
     Import Import = new Import();
     Import.TXTImport();
     
     setSize(800,800);
     JPanel MainPannel = new JPanel();
     MainPannel.setLayout(null);
     getContentPane().add(MainPannel);
     MainPannel.setBounds(0, 0, 800, 800);
     
   
     Feld Feld = new Feld();
     Feld.setLayout(null);
     MainPannel.add(Feld);
     Feld.setBounds(50, 20, 700, 700);
     setVisible(true);
     
     VonRechts = new JButton("Von rechts");
     VonLinks1 = new JButton("Von links1");
     VonLinks2 = new JButton("Von links2");
     Schliessen = new JButton("Schließen");
     
     MainPannel.add(VonRechts);   
     MainPannel.add(VonLinks1);
     MainPannel.add(VonLinks2);
     MainPannel.add(Schliessen);     

     int PosxStart = 50;
     int PosyStart = 750;
     int BreiteButton = 160;
     int HoeheButton = 40;
     int delta = 20;
     
     VonRechts.setBounds(PosxStart, PosyStart, BreiteButton, HoeheButton);
     VonLinks1.setBounds(PosxStart+(BreiteButton+delta)*1, PosyStart, BreiteButton, HoeheButton);
     VonLinks2.setBounds(PosxStart+(BreiteButton+delta)*2, PosyStart, BreiteButton, HoeheButton);
     Schliessen.setBounds(PosxStart+(BreiteButton+delta)*3, PosyStart, BreiteButton, HoeheButton);

     VonRechts.addActionListener(this);
     VonLinks1.addActionListener(this);
     VonLinks2.addActionListener(this);
     Schliessen.addActionListener(this);
     
   }
   

   
   public void actionPerformed(ActionEvent e)
   {

     if (e.getSource() == VonRechts)
     {

       StartPos[0] = 700;   
       StartPos[1] = 350;
       
      new Thread() {
      @Override
      public void run() {
         
      Bewegen();
     
      };
      }.start();

     }
     
     if (e.getSource() == VonLinks1)
     {
       
       StartPos[0] = 0;   
       StartPos[1] = 350;
     
       Hoehenkontrolle=true;
       
      new Thread()
      {
      @Override
      public void run() {
         
      Bewegen();
     
      };
      }.start();
       
      }
     
     if (e.getSource() == VonLinks2)
     {
       
       StartPos[0] = 0;   
       StartPos[1] = 350;
       
      new Thread()
      {
      @Override
      public void run() {
         
      Bewegen();
     
      };
      }.start();
      }
     
     if (e.getSource() == Schliessen)
     {
       System.exit(0);
     }   
     
   }
   
   
  public void Start()
   {
   }
   
  public void Bewegen()
   {   
     Weg Weg = new Weg(StartPos);
     int delay = 200;   
     Timer t = new Timer(delay,
         
       new ActionListener() {
        public void actionPerformed( ActionEvent e )
        {
           
           if (Pack1.GlobalVar.AktPos == Pack1.GlobalVar.SollPos)
           {
             return;
           }
           
           if (Hoehenkontrolle == true && Pack1.GlobalVar.HoeheUeberschritten == true)
           {
             return;
           }
           
           
           Weg.NaechstePos();
           repaint();
        }     

       }      
     
     );t.start();
   }
   
   
  public void destroy()
  {
     System.exit(0);
  }
   
  public void stop()
  {
     System.exit(0);
  }
}
 

Enceladus271

Bekanntes Mitglied
Das Problem ist wahrscheinlich, dass du bei jedem Button-Klick einen neuen Timer erstellst. Du hast beim zweiten Klick schon zwei Timer laufen. Versuch mal nur einen Timer zu erstellen um den dann beim Klick zu starten und bei der Abbruchbedingung zu beenden.

Beispiel (Java 8):
Java:
public class TimerExample extends JPanel {

   private final Timer timer = new Timer(100, null);
   private int xPos;
   private int signum = 1;

   public TimerExample() {
     super(new BorderLayout());
     setPreferredSize(new Dimension(400, 400));

     timer.addActionListener(event -> {
       if (xPos == 200) {
         timer.stop();
       }
       xPos += signum * 5;
       TimerExample.this.repaint();
     });

     JButton leftButton = new JButton("von links");
     leftButton.addActionListener(event -> {
       xPos = 0;
       signum = 1;
       timer.start();
     });

     JButton rightButton = new JButton("von rechts");
     rightButton.addActionListener(event -> {
       xPos = 400;
       signum = -1;
       timer.start();
     });
     add(leftButton, BorderLayout.NORTH);
     add(rightButton, BorderLayout.SOUTH);
   }

   @Override
   protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.fillOval(xPos, 200, 10, 10);
   }

   public static void main(String[] args) {
     JFrame frame = new JFrame();
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.add(new TimerExample());
     frame.pack();
     frame.setLocationRelativeTo(null);
     frame.setVisible(true);
   }
}
 

andi11

Mitglied
Habe es wie folgt geändert, aber es funktioniert leider immer noch nicht.
Es kommt zum selben Problem.

Java:
package Pack1;

import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;


public class ProgrammStart extends JApplet implements ActionListener {
  
   int [] StartPos= {0,0};
   private final Timer timer = new Timer(100, null);
  
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen;

   private boolean Hoehenkontrolle = false;
  
   public void init()
   {
    
     Import Import = new Import();
     Import.TXTImport();
    
     setSize(800,800);
     JPanel MainPannel = new JPanel();
     MainPannel.setLayout(null);
     getContentPane().add(MainPannel);
     MainPannel.setBounds(0, 0, 800, 800);
     
     Feld Feld = new Feld();
     Feld.setLayout(null);
     MainPannel.add(Feld);
     Feld.setBounds(50, 20, 700, 700);
     setVisible(true);
    
     VonRechts = new JButton("Von rechts");
     VonLinks1 = new JButton("Von links1");
     VonLinks2 = new JButton("Von links2");
     Schliessen = new JButton("Schließen");
    
     MainPannel.add(VonRechts);  
     MainPannel.add(VonLinks1);
     MainPannel.add(VonLinks2);
     MainPannel.add(Schliessen);    

     int PosxStart = 50;
     int PosyStart = 750;
     int BreiteButton = 160;
     int HoeheButton = 40;
     int delta = 20;
    
     VonRechts.setBounds(PosxStart, PosyStart, BreiteButton, HoeheButton);
     VonLinks1.setBounds(PosxStart+(BreiteButton+delta)*1, PosyStart, BreiteButton, HoeheButton);
     VonLinks2.setBounds(PosxStart+(BreiteButton+delta)*2, PosyStart, BreiteButton, HoeheButton);
     Schliessen.setBounds(PosxStart+(BreiteButton+delta)*3, PosyStart, BreiteButton, HoeheButton);

     VonRechts.addActionListener(this);
     VonLinks1.addActionListener(this);
     VonLinks2.addActionListener(this);
     Schliessen.addActionListener(this);
    
   }
  

  
   public void actionPerformed(ActionEvent e)
   {

     if (e.getSource() == VonRechts)
     {

      new Thread()
      {
      @Override
      public void run()
      {

           StartPos[0] = 700;  
           StartPos[1] = 350;
          
           Bewegen();  

      }
      }.start();

     }
    
     if (e.getSource() == VonLinks1)
     {

      new Thread()
      {
      @Override
      public void run()
      {

           StartPos[0] = 0;  
           StartPos[1] = 350;
           Hoehenkontrolle=true;
          
           Bewegen();  
      }
      }.start();

     }
    
    
     if (e.getSource() == VonLinks2)
     {

      new Thread()
      {
      @Override
      public void run()
      {

           StartPos[0] = 0;  
           StartPos[1] = 350;
          
           Bewegen();  

      }
      }.start();

     }
    
     if (e.getSource() == Schliessen)
     {
       System.exit(0);
     }  
    
   }
  
  
  public void Start()
   {
   }
  
  public void Bewegen()
   {  

     Weg Weg = new Weg(StartPos);
     timer.start();
    
  timer.addActionListener(event -> {

       if (Pack1.GlobalVar.AktPos == Pack1.GlobalVar.SollPos)
       {
         timer.stop();
         return;
       }
      
       if (Hoehenkontrolle == true && Pack1.GlobalVar.HoeheUeberschritten == true)
       {
         timer.stop();
         return;
       }
      
      
       Weg.NaechstePos();
       repaint();  
    
  });

  }
  
  public void destroy()
  {
     System.exit(0);
  }
  
  public void stop()
  {
     System.exit(0);
  }

}
 

andi11

Mitglied
Hallo Enceladus271,

vielen Dank nochmal für dein interessantes Beispiel.

Leider habe ich noch ein weiteres Problem. Bei der Ausführung des Programms im Internet Explorer bekomme ich immer den Fehler „NullPointerException“. Habe schon alle Initialisierungen mit dem Begriff „null“ entfernt, aber es funktioniert immer noch nicht. Darf ich kein Objekt mit „null“ oder „0“ initialisieren. Muss ich alle Objekte mit irgendetwas >0 vollschreiben oder was ist genau das Problem? Was ist mit größeren Arrays oder Arraylisten. Wie soll ich die dann genau initialisieren?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also die Initialisierung mit 0 und null ist ganz problemlos. Die NPE tritt nur auf, wenn versucht wird auf Dinge in einem Objekt zuzugreifen und die Referenz null ist. Ich mag ja die Vergleiche mit reellen Objekten:
Es ist absolut kein Problem, ohne Geldbörse aus dem Haus zu gehen. (meineGeldboerse = null). Das funktioniert ohne Probleme. Nur wenn ich dann doch auf die Geldbörse zugreifen will (also z.B. meineGeldboerse.entnimmFührerschein()), dann tritt eben dieses Problem auf.

Es muss aber kein Problem sein. Ich hätte ja etwas machen können wie:
Code:
if (meineGeldboerse == null) {
  polizist.teileMit("Habe meinen Führerschein zuhause vergessen!");
} else {
  Fuehrerschein fuehrerschein = meineGeldboerse.entnimmFuehrerschein();
  polizist.gib(fuehrerschein);
}

Es ist also eigentlich ein Programmierfehler, denn der Programmierer hat ein Objekt nicht richtig initialisiert (null ist da dann ausgeschlossen) oder eben den Fall nicht bedacht, dass eine Instanz auch null sein kann.

Was häufig falsch gemacht wird ist die Kontrolle von Funktionen, die auch null zurück geben können.
Wenn eine Funktion bei nicht Erfolg einfach null zurück gibt, dann muss ich den Erfolg prüfen. Wenn ich dies nicht mache, dann bekomme ich diesen NPE, der dann oft auch nichts sagt, weil das gerne in verschachtelten Funktionen passiert a.la.:
zeigeBildAn(konvertiereZuBMP(ladeResource("meineRessource")));
Hier könntest Du dann evtl. in zeigeBildAn eine NPE bekommen. Und was könnte da der Fehler sein?
- Konnte die Ressource nicht geladen werden?
- Konnte die Ressource nicht konvertiert werden?
- fehlte irgend etwas anderes in zeigeBildAn?

Also eine Sache, die ich für nicht ganz so sauber finde und die eine Fehlersuche stark verkomplizieren kann.

Das nur als kleine Anmerkung zu NPE. Und vielleicht hilft es ja, wenn Du verstärkst kontrollierst, was an Initialisierungen geklappt hat und was nicht.

An der Stelle auch eine andere Sache, die aufzukommn scheint. Contract Annotations geben Details vor, ob eine Funktion auch null zurück geben kann oder ob null ein akzeptables Argument ist. Damit kann der Compiler schon sehr viel abfangen und dafür sorgen, dass NPEs der Vergangenheit angehören.
Ob und wie die sich aber wirklich durchsetzen und kommen, ist noch offen.
Quellen:
https://www.jetbrains.com/idea/help/contract-annotations.html
https://github.com/nhatminhle/cofoja
Nur um mal zwei Quellen aufzuführen. Lass Dich davon aber jetzt nicht verwirren. Für die konkrete Problemlösung ist dies erst einmal nicht geeignet.
 

andi11

Mitglied
Ich habe nun mal Teile des Programms ausprobiert und so wie es aussieht tritt unter anderem bei der folgenden Klasse das NullPointerException Problem auf. Ich erkenne aber den Fehler nicht.

Java:
package Pack1;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

public class Import  {

   public Import()  
   {
   }
     
   public void TXTImport ()   
   {

     //-----------------------------------------------------------------------------
     // ------- Textzeilen aus der Datei einlesen und in Array speichern -----------
     //-----------------------------------------------------------------------------
     
     String FilePath = this.getClass().getResource("").getPath();
     String FileName = GlobalVar.FileName;
    FileReader fr;
    BufferedReader br;
    ArrayList<String> Textarray = new ArrayList<String>();
    String Zeilentext;
     
     int i = 0;
     try   
     {
     fr = new FileReader(FilePath + "/" + FileName);     
  br = new BufferedReader(fr);                   

  do
  {
     Zeilentext = br.readLine();         
  Textarray.add (Zeilentext);         
  //System.out.println(Textarray.get(i));
   
         i=i+1;     
  }
  while (Zeilentext != null);

  fr.close();
   
     }
   
     catch (IOException e)
     {
  System.out.println("Fehler beim Lesen der Datei " + FileName);
     }   
     
     //-----------------------------------------------------------------------------
     // ------- Einlegen der Textliste in ein Array  -----------
     //-----------------------------------------------------------------------------
     
  int y;             
  int x;               
  int yEnd;           
  int xEnd;           
  String s;           
  String [] ZahlenString;     
  double [][] ZahlenArray;   
   
  y = 0;
  x = 0;
  yEnd = i-1;
   
  s = Textarray.get(y);       
  ZahlenString = s.split("\\t");   
  xEnd= ZahlenString.length;     
  ZahlenArray = new double[xEnd][yEnd];   
   
  while (y < yEnd)
  {
  s = Textarray.get(y);         
  s=s.replaceAll("\\,",".");       
  ZahlenString = s.split("\\t");   
   
  while (x < xEnd )
     {
       ZahlenArray[y][x] = Double.parseDouble(ZahlenString[x]);         
     x++;
     }
     x=0;
     y++;
  }
   
  Pack1.GlobalVar.PotFeld=ZahlenArray.clone();
   }
}
 

Joose

Top Contributor
Das kann zum Beispiel vorkommen wenn man fixe Pfade verwendet für Bilder und vergisst diese anzupassen.
Eclipse führt das Programm aus und die Pfade passen da. Exportiert man nun ein JAR und führt das ganze auf einem anderen PC aus und hat dabei vergessen die Pfade anzupassen (oder gar die Bilder nicht mitgegeben) dann kann das Programm diese natürlich nicht laden und es könnte eine NPE fliegen

Was es bei deinem Programm ist was die NPE verursacht kannst nur du uns mit Hilfe des StackTraces sagen :)

.... tritt unter anderem bei der folgenden Klasse das NullPointerException Problem auf. Ich erkenne aber den Fehler nicht.

Du solltest einen StackTrace bekommen, wenn eine Exception fliegt. Dieser verrät eigentlich genau in welcher Zeile von welcher Klasse/Datei die Exception auftritt. Mit dieser Information können wir dir weiter helfen.
 
K

kneitzel

Gast
Vermutlich weil eine Ressource nicht geladen werden konnte. Gab es ja schon mehrfach Threads zu. Du prüfst ja auch an keiner Stelle, was zurück gegeben wurde. Schon eine der ersten Zeilen ist eine Konstellation, wie ich sie angesprochen habe:
this.getClass().getResource("").getPath();

Was steckt denn in FilePath drin, wenn der Fehler kommt? Und was mich auch etwas wundert: Du lässt es über den Internet Explorer laufen? Und greifst auf das lokale Filesystem zu? Oder habe ich da jetzt etwas falsch verstanden? Dann wäre https://docs.oracle.com/javase/tutorial/deployment/applet/security.html evtl. wichtig. Und dann ist der FilePath evtl. auch nicht so, wie Du Ihn erwarten würdest.

Aber ich muss gestehen, dass ich bisher nichts groß mit Applets gemacht habe - da werden andere bestimmt besser Bescheid wissen.
 

andi11

Mitglied
Habe nun einen StackTrace eingebaut. Dieser verweist genau auf diese Zeile:
this.getClass().getResource("").getPath();

Wie kann ich denn sonst einen relativen Pfad angeben?
Oder in welchem Ordner muss die Datei, die ich einlesen möchte abgelegt werden?
 
K

kneitzel

Gast
Hast Du ein signiertes Applet, dass auch Rechte auf das Filesystem hat? Ansonsten hast Du keinen Zugriff auf das Dateisystem.
 

andi11

Mitglied
Hallo zusammen,
ich habe es nun so gelöst, dass die Datei nicht mehr importiert werden muss. Jetzt funktioniert es soweit.
Es bleibt nun nur noch das Problem mit den Button, die nach einem Durchlauf nicht mehr reagieren wollen. (siehe Frage von Montag, 15.02. 23:16 Uhr). Im Internet Explorer zeigt ebenfalls der Button "Schießen keine Wirkung.
 

andi11

Mitglied
Hallo, hat keiner eine Idee. Oder liegt es an den Threads. Muss vielleicht der jeweilige Thread vorher gestoppt werden? Aber wie genau kann ich den jeweiligen Thread ansprechen? Oder gibt es eine Möglichkeit, dass sich das Programm einfach selber neu startet?

Java:
package Pack1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import javax.swing.Timer;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class ProgrStart extends JApplet implements ActionListener {
   
   int [] StartPos= {0,0};
   private final Timer timer = new Timer(100, null);
   
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Schliessen;

   private boolean Hoehenkontrolle = false;
   
   JPanel MainPanel = new JPanel();
   Feld Feld = new Feld();
   
   public void init()
   {
     
     String stackTrace = "No StackTrace";
     
     try
     {
     
       //Import Import = new Import();
       //Import.TXTImport();
       
       setSize(800,800);
       
       MainPanel.setLayout(null);
       getContentPane().add(MainPanel);
       MainPanel.setBounds(0, 0, 800, 800);

       Feld.setLayout(null);
       MainPanel.add(Feld);
       Feld.setBounds(50, 20, 700, 700);
       setVisible(true);
       
       
       VonRechts = new JButton("Von rechts");
       VonLinks1 = new JButton("Von links1");
       VonLinks2 = new JButton("Von links2");
       Schliessen = new JButton("Schließen");
       
       MainPanel.add(VonRechts);   
       MainPanel.add(VonLinks1);
       MainPanel.add(VonLinks2);
       MainPanel.add(Schliessen);     
   
       int PosxStart = 50;
       int PosyStart = 750;
       int BreiteButton = 160;
       int HoeheButton = 40;
       int delta = 20;
       
       VonRechts.setBounds(PosxStart, PosyStart, BreiteButton, HoeheButton);
       VonLinks1.setBounds(PosxStart+(BreiteButton+delta)*1, PosyStart, BreiteButton, HoeheButton);
       VonLinks2.setBounds(PosxStart+(BreiteButton+delta)*2, PosyStart, BreiteButton, HoeheButton);
       Schliessen.setBounds(PosxStart+(BreiteButton+delta)*3, PosyStart, BreiteButton, HoeheButton);
   
       VonRechts.addActionListener(this);
       VonLinks1.addActionListener(this);
       VonLinks2.addActionListener(this);
       Schliessen.addActionListener(this);
     
     } catch(Exception e)
     {
        final ByteArrayOutputStream stream = new ByteArrayOutputStream();
        e.printStackTrace(new PrintStream(stream));
        stackTrace = stream.toString();
        JOptionPane.showMessageDialog(null, stackTrace);
     }   
   }
   

   public void actionPerformed(ActionEvent e)
   {
     if (e.getSource() == VonRechts)
     {

       new Thread()
      {
      @Override
      public void run()
      {
           
           StartPos[0] = 700;   
           StartPos[1] = 350;
           Bewegen();   

      }
      }.start();   
       
     }
     
     if (e.getSource() == VonLinks1)
     {

      new Thread()
      {
      @Override
      public void run()
      {

           StartPos[0] = 0;   
           StartPos[1] = 350;
           Hoehenkontrolle=true;
           
           Bewegen();   
      }
      }.start();

     }
     
     
     if (e.getSource() == VonLinks2)
     {

      new Thread()
      {
      @Override
      public void run()
      {

           StartPos[0] = 0;   
           StartPos[1] = 350;
           
           Bewegen();   

      }
      }.start();

     }
     
     if (e.getSource() == Schliessen)
     {
     
     }   
     
   }
   
   
  public void Start()
   {
   }
   
  public void Bewegen()
   {   
     Weg Weg = new Weg(StartPos);
     timer.start();
     
  timer.addActionListener(event -> {

       if (Pack1.GlobalVar.AktPos == Pack1.GlobalVar.SollPos)
       {
         timer.stop();
         return;
       }
       
       if (Hoehenkontrolle == true && Pack1.GlobalVar.HoeheUeberschritten == true)
       {
         timer.stop();
         return;
       }
       
       
       Weg.NaechstePos();
       repaint();   
     
  });
   }
   
   
  public void destroy()
  {   
  }
   
  public void stop()
  {  
  }
}
 

Enceladus271

Bekanntes Mitglied
Der Listener sollte nur einmal zum Timer hinzugefügt werden. Bislang wird bei jedem Aufruf von bewegen() ein neuer Listener hinzugefügt. Ich tippe mal darauf dass es daran liegt.

bewegen() muss übrigens auch nicht mehr in einem eigenen Thread aufgerufen werden. Der Timer sorgt schon dafür das der Event-Dispatch-Thread nicht mehr blockiert wird.
 

andi11

Mitglied
Zu Anfang hatte ich keinen Thread und habe bewegen() direkt unter jedem Button unter "actionPerformed" aufgerufen. Dabei wurde der Ball gar nicht angezeigt. Dann habe ich je einen Thread unter allen Button unter "actionPerformed" hinzugefügt. Es trat das selbe Problem auf wie jetzt.
Mit dem Timer hatte ich auch so meine Probleme. Wie könnte ich ihn denn am besten einbauen?
 

Enceladus271

Bekanntes Mitglied
Ich hab ja schon ein funktionierendes Beispiel gepostet.

Füg mal einfach den ActionListener am Ende der init() Methode zum Timer hinzu:
Java:
    timer.addActionListener(event -> {
       Weg Weg = new Weg(StartPos);
       if (Pack1.GlobalVar.AktPos == Pack1.GlobalVar.SollPos) {
         timer.stop();
         return;
       }

       if (Hoehenkontrolle == true && Pack1.GlobalVar.HoeheUeberschritten == true) {
         timer.stop();
         return;
       }

       Weg.NaechstePos();
       repaint();
     });

In der bewegen() Methode wird nur noch der Timer gestartet:
Java:
  public void Bewegen() {
     timer.start();
   }

Wenn das nicht Hilft, dann poste mal den Code der anderen Klassen die benutzt werden.
 

andi11

Mitglied
Nun habe ich den Fehler endlich gefunden. Ich habe zwar den Timer nochmal geändert und auch die Threads rausgeworfen, aber letzt endlich lag es nicht daran, sondern die Startposition wurde in der Klasse „Weg“ nicht übernommen. Hier hatte ich nämlich noch eine if-Abfrage -> Wenn die Anzahl der Schritte = 0 sind, dann übernehme Startposition, sonst nicht.

Eine Kleinigkeit fehlt nun noch :

Wenn ich das Fenster verkleinere soll der Ball stehen bleiben. Hierzu gebe ich unter der Methode public void stop() Timer.wait() an. Das wird allerdings in Eclipse als Fehler angezeigt und funktioniert auch im Internet Explorer nicht. Warum?

Ist die Angabe unter destroy() richtig?

Java:
package Pack1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import javax.swing.Timer;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class ProgrammStart extends JApplet implements ActionListener {
   
   int [] StartPos= {0,0};
   private final Timer timer = new Timer(100, null);
   
   private JButton VonLinks1;
   private JButton VonLinks2;
   private JButton VonRechts;
   private JButton Stop;

   private boolean Hoehenkontrolle = false;
   
   JPanel MainPanel = new JPanel();
   Feld Feld = new Feld();
   Weg Weg = new Weg();
   
   
   
   public void init()
   {
     

       setSize(800,800);
       
       MainPanel.setLayout(null);
       getContentPane().add(MainPanel);
       MainPanel.setBounds(0, 0, 800, 800);
       
       Feld.setLayout(null);
       MainPanel.add(Feld);
       Feld.setBounds(50, 20, 700, 700);
       setVisible(true);
       
       VonRechts = new JButton("Von rechts");
       VonLinks1 = new JButton("Von links1");
       VonLinks2 = new JButton("Von links2");
       Stop = new JButton("Stop");
       
       MainPanel.add(VonRechts);   
       MainPanel.add(VonLinks1);
       MainPanel.add(VonLinks2);
       MainPanel.add(Stop);     

       int PosxStart = 50;
       int PosyStart = 750;
       int BreiteButton = 160;
       int HoeheButton = 40;
       int delta = 20;
       
       VonRechts.setBounds(PosxStart, PosyStart, BreiteButton, HoeheButton);
       VonLinks1.setBounds(PosxStart+(BreiteButton+delta)*1, PosyStart, BreiteButton, HoeheButton);
       VonLinks2.setBounds(PosxStart+(BreiteButton+delta)*2, PosyStart, BreiteButton, HoeheButton);
       Stop.setBounds(PosxStart+(BreiteButton+delta)*3, PosyStart, BreiteButton, HoeheButton);

       VonRechts.addActionListener(this);
       VonLinks1.addActionListener(this);
       VonLinks2.addActionListener(this);
       Stop.addActionListener(this);
       
       timer.addActionListener(this);   

   }
   
  public void Start()
   {
           
   }

   public void actionPerformed(ActionEvent e)
   {
     
     try
     {

       if (e.getSource() == VonRechts)
       {     

         StartPos[0] = 700;   
         StartPos[1] = 350;
         Pack1.GlobalVar.AnzSchritte=0;

         timer.start();
     
       }
       
       if (e.getSource() == VonLinks1)
       {         
         StartPos[0] = 0;   
         StartPos[1] = 350;
         Pack1.GlobalVar.AnzSchritte=0;
         Hoehenkontrolle = true;
         timer.start();     
       }
       
       
       if (e.getSource() == VonLinks2)
       {
         StartPos[0] = 0;   
         StartPos[1] = 350;
         Pack1.GlobalVar.AnzSchritte=0;
         timer.start();   
       }
       
       if (e.getSource() == Stop)
       {
         timer.wait();
       }   
   
       if (e.getSource() == timer)
       {
           Weg.NaechstePos(StartPos);
           repaint();           
         
           if (Pack1.GlobalVar.AktPos == Pack1.GlobalVar.SollPos)
           {
             timer.wait();
             return;
           }
           
           if (Hoehenkontrolle == true && Pack1.GlobalVar.HoeheUeberschritten == true)
           {
             Hoehenkontrolle = false;
             timer.wait();
             return;
           }
       }
       
     } catch(Exception ex2)
     {   
       timer.stop();
     }
     
   }
   
   public void stop()
  {     
     timer.wait();
  }
   
  public void destroy()
  {     
     timer.stop();
     remove(MainPanel);
     remove(Feld);
  }
}
 

Enceladus271

Bekanntes Mitglied
wait() ist nicht das was du brauchst. Beim Aufruf von timer.wait() wartet der aufrufende Thread solange bis ein anderer Thread timer.notify() aufruft (siehe Javadoc zur Klasse Object).

Was spricht dagegen einfach timer.stop() zu verwenden? Mit timer.start() kannst du ihn ja danach wieder weiterlaufen lassen.

Ich glaube nicht dass bei einer Verkleinerung des Fensters die destroy() Methode aufgerufen wird. Um auf eine Größenänderung zu reagieren, musst du dem Fenster einen ComponentListener hinzufügen:
Java:
    final Window window = javax.swing.SwingUtilities.getWindowAncestor(ProgrammStart.this);
     window.addComponentListener(new ComponentAdapter() {

       @Override
       public void componentResized(ComponentEvent e) {
         // if ...
         // timer.stop();
       }
     });

Der Code muss ausgeführt werden, wenn das Applet schon im Fenster liegt, denn sonst gibt getWindowAncestor null zurück. Versuch mal den Code in die start() Methode des Applets einzubauen.
 

andi11

Mitglied
Hallo Enceladus271,

Unter der Methode stop() reagiert timer.stop() nicht. Im Timer stopt timer.stop() diesen zwar, aber er kann nicht mehr durch Druck auf einen anderen Button gestartet werden. Hier funktioniert nur timer.wait().

Nun habe ich die unterschiedlichen Methoden wie folgt mit Aufruf eines Fensters überprüft.
In Eclipse wird nach Minimieren des Fensters die Methode stop() aufgerufen und nach Schießen des Fensters die Methode destroy().
Im Explorer funktionert nur destroy(). Das aber auch nur, wenn der Tab geschlossen wird und ein anderer geöffnet bleibt. Vielleicht funktioniert das mit dem Minimieren ja nur über html.
Der ComponentListener funktioniert nicht.


Java:
  public void Start()
   {

     final Window window = javax.swing.SwingUtilities.getWindowAncestor(ProgrammStart.this);
  window.addComponentListener(new ComponentAdapter() {

  @Override
  public void componentResized(ComponentEvent e) {
      JOptionPane.showMessageDialog(null, "Fenster wurde minimiert2!");
  }
  });       
   }

---------------------------------
  public void stop()
  {     
     JOptionPane.showMessageDialog(null, "Fenster wurde minimiert!");
  }
   
  public void destroy()
  {     
     JOptionPane.showMessageDialog(null, "Fenster wurde geschlossen!");
     timer.stop();
     remove(MainPanel);
     remove(Feld);
  }
 

Enceladus271

Bekanntes Mitglied
Verkleinern und minimieren sind auch unterschiedlich Dinge. Wenn du das Minimieren mitbekommen willst würde ich statt des ComponentListeners einen WindowListener nehmen. Dort kannst du dann
windowIconified und windowDeiconified implementieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
S Geladenes Bild wird nicht in JPanel angezeigt AWT, Swing, JavaFX & SWT 7
H Bild wird nicht angezeigt, Fehlercode unverständlich AWT, Swing, JavaFX & SWT 5
J Swing Bild wird nicht auf JLabel angezeigt AWT, Swing, JavaFX & SWT 12
N Bild wird nicht dargestellt AWT, Swing, JavaFX & SWT 4
M ImageIcon Bild wird beim verkleinern des Fensters nicht verkleinert AWT, Swing, JavaFX & SWT 3
P 2D-Grafik Wieso wird das Bild nicht angezeigt ? AWT, Swing, JavaFX & SWT 4
Z Swing Bild wird nicht angezeigt AWT, Swing, JavaFX & SWT 25
D Bild in JAR wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S Bild wird auf Canvas in Applet nicht gezeichnet AWT, Swing, JavaFX & SWT 4
T AWT Bild wird nicht angezeigt AWT, Swing, JavaFX & SWT 7
S Bild wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
A Bild wird nicht ausgegeben AWT, Swing, JavaFX & SWT 4
V Bild wird nicht auf JPanel gezeichnet; Java Problem AWT, Swing, JavaFX & SWT 10
F Bild wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
E warum wird mein bild nicht angezeigt? AWT, Swing, JavaFX & SWT 6
C Bild wird nicht immer geladen AWT, Swing, JavaFX & SWT 2
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
M JavaFX - Bild in Jar einbinden, sodass es auch außerhalb der IDE geladen wird. AWT, Swing, JavaFX & SWT 2
GianaSisters Bild wird S/W gespeichert. AWT, Swing, JavaFX & SWT 4
M Trotz richtiger Daten, falsches Bild wird gezeichnet?! AWT, Swing, JavaFX & SWT 4
I Swing Bild wird erst bei manueller Änderung der Fenstergrösse gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Bild wird nie angezeigt, egal mit welcher Methode! AWT, Swing, JavaFX & SWT 10
W Bild im ImagePanel (AWT) wird nur machmal neu gezeichnet AWT, Swing, JavaFX & SWT 22
A Skaliertes Bild wird rötlich eingefärbt AWT, Swing, JavaFX & SWT 2
S Bild wird überschrieben AWT, Swing, JavaFX & SWT 5
H Bild wird kleiner AWT, Swing, JavaFX & SWT 8
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
B 2D-Grafik Bild farblich filtern AWT, Swing, JavaFX & SWT 2
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
A JPanel Bild laden (Porblem mit Dateipfad) AWT, Swing, JavaFX & SWT 2
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
M "ImageIO.read()" liest Bild nicht richtig ein AWT, Swing, JavaFX & SWT 3
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
C GUI öfters durchlaufen und hinterher Bild speichern AWT, Swing, JavaFX & SWT 1
M AWT Farben in Bild ersetzen AWT, Swing, JavaFX & SWT 11
E JavaFX Bild einfügen AWT, Swing, JavaFX & SWT 6
G paintComponents zerstückelt Bild AWT, Swing, JavaFX & SWT 0
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
C Bild Koordinaten AWT, Swing, JavaFX & SWT 6
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
M Bild in JPanel mit Maus einfügen AWT, Swing, JavaFX & SWT 0
B JPanel und png-Bild AWT, Swing, JavaFX & SWT 2
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
A Swing Malprogramm Bild speichern? AWT, Swing, JavaFX & SWT 9
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
Y JavaFX Bild speichern und Pfad dazu abspeichern AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
C Bild in JFrame AWT, Swing, JavaFX & SWT 8
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben