Input/Output Warum wirft mir das Programm diesen Fehler?

UbuLin

Mitglied
Hallo,
wollte ein kleines Zeichenprogramm schreiben klappt eigentlich aber währenddessen ich das Programm ausführe spamt das Programm mir den folgenden Fehler in die Console

Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at de.timux.gui.Label.paintComponent(Label.java:44)
    at de.timux.listeners.MouseHandler.mouseMoved(MouseHandler.java:37)
    at java.awt.Component.processMouseMotionEvent(Component.java:6578)
    at java.awt.Component.processEvent(Component.java:6302)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Window.processEvent(Window.java:2025)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Meine Frage. Weiß jemand warum oder wann dieser Fehler auftritt und könnte mir dies schreiben. Ist halt so extrem dumm den man kann keine Sysouts mehr lesen die man geschrieben hat.
Könnte für den Notfall auch meinen Code posten, dachte aber vielleicht kann mir ja einer sagen warum dieser Fehler allgemein auftritt.
Hoffe auf hilfreiche Antworten!

Lg UbuLin🙂
 
Ok hier die Main:

Java:
package de.timux.main;

import de.timux.gui.Fenster;
import de.timux.gui.Label;
import de.timux.listeners.MouseHandler;
import de.timux.objects.Var;

public class Main {

    public static void main(String[] args) {
       
        new Var();
        new MouseHandler();
        new Label();
        new Fenster();

    }

}

Hier die Var Klasse

Java:
package de.timux.objects;

public class Var {
   
    public static short frameWidth = 500,
                        frameHight = 500;
   
    public static short mouseX,
                        mouseY;

}

Hier die MouseHandler Klasse

Java:
package de.timux.listeners;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import de.timux.gui.Label;
import de.timux.objects.Var;

public class MouseHandler implements MouseListener, MouseMotionListener {
   
    Label label = new Label();

    @Override
    public void mousePressed(MouseEvent e) {
        this.label.getPaint();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        this.label.getNotPaint();
       
    }

    @Override
    public void mouseDragged(MouseEvent e) {
       
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        Var.mouseX = (short) e.getX();
        Var.mouseY = (short) e.getY();
        // System.out.println("mouseX: " + Var.mouseX + "\nmouseY: " + Var.mouseY);
        this.label.setmX(e.getX());
        this.label.setmY(e.getY());
        this.label.paintComponent(this.label.getGraphics());
           
    }

   
   
   
   
   
   
   
    // wird momentan nicht benötigt
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
       
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
       
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
       
    }

}

Hier die Label Klasse

Java:
package de.timux.gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JLabel;
import javax.swing.JPanel;

import de.timux.objects.Var;

public class Label extends JPanel{
   
    public static int mX;
    public static int mY;
    public static boolean paint = false;
   
    public int getmX() {
        return mX;
    }

    public void setmX(int mX) {
        Label.mX = mX;
    }

    public int getmY() {
        return mY;
    }

    public void setmY(int mY) {
        Label.mY = mY;
    }
   
    public void getPaint() {
        paint = true;
    }
   
    public void getNotPaint() {
        paint = false;
    }
   
    public void paintComponent(Graphics g) {
       
        g.setColor(Color.BLACK);
        g.fillOval(mX, mY, 50, 50);
       
        repaint();

    }

}

Und hier die Fenster Klasse

Java:
package de.timux.gui;

import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JLabel;

import de.timux.listeners.MouseHandler;
import de.timux.objects.Var;

public class Fenster extends JFrame {
   
    private static final long serialVersionUID = 1L;
    private JFrame frame;
    private Label label;
   
    public Fenster() {
       
        frame = new JFrame();
        this.setTitle("Malprogramm");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.addMouseListener(new MouseHandler());
        this.addMouseMotionListener(new MouseHandler());
        Container c = getContentPane();
        this.label = new Label();
        c.add(label);
        this.setVisible(true);
       
    }

}
 
Wenn ich das richtig sehe erzeugst du in deinem MouseHandler ein Label das aber nirgendwo angezeigt wird. label.getGraphics() wird daher null zurück liefern, wodurch in der paintComponent die NullPointerException geworfen wird.

Es macht übrigens in den seltensten Fällen Sinn die Methode paintComponent selber aufzurufen. Und ein repaint innerhalb der paintComponent wird wahrscheinlich eine Endlosschleife erzeugen.
 
Hallo vielen Dank für die Antwort. Verstehe jetzt glaube ich wenigstens warum er den Error wirft
Jedoch wenn ich in dem MouseHandler versuche die paintComponent aufzurufen, dann erwartet er Parameter, was soll ich dort reinschreiben?

Hab das mal mit Slashs umrandet

Java:
package de.timux.listeners;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import de.timux.gui.Label;
import de.timux.objects.Var;

public class MouseHandler implements MouseListener, MouseMotionListener {

    @Override
    public void mousePressed(MouseEvent e) {
        Label.getPaint();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        Label.getNotPaint();
      
    }

    @Override
    public void mouseDragged(MouseEvent e) {
      
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        Var.mouseX = (short) e.getX();
        Var.mouseY = (short) e.getY();
/////////////////////////////////////////
        /////////////////////////////////
        Label.paintComponent();
        /////////////////////////////////
/////////////////////////////////////////
        Label.setmX(e.getX());
        Label.setmY(e.getY());
      
          
    }

  
  
  
  
  
  
  
    // wird momentan nicht benötigt
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
      
    }

}
 
PaintComponent() ruft man nicht selber auf. Wenn du willst das das Label neu gezeichnet wird dann rufst du repaint() auf. Das bedeutet aber nicht das das dann unmittelbar geschieht sondern erst wenn Swing meint das es Zeit dafür hat
 
Hallo nochmal,

vielen Dank an alle die auf diesen Thread geantwortet haben, denn es funktioniert jetzt perfect und die nervige Fehlermeldung ist auch nicht mehr da🙂

Gibt es irgendeine Funktion um den Thread als gelöst zu markieren, oder zu schließen?

LG UbuLin
 

Zurück
Oben