Methode zum Zeichnen von Elementen

MEETyA

Mitglied
Hallo,

folgende Situation: Ich habe ein Hauptprogramm in dem gibt es ein DrawPanel Objekt namens Canvas. Bei einem ActionEvent im Hauptprogramm soll nun mittels aufruf von canvas.paint(int x1, int y1, int x2, int y2); eine Linie gezeichnet werden.

Ich bin noch totaler neuling in Sachen Java und finde leider keine Beispiele zu diesem Thema.

Scheinbar mache ich etwas falsch, da ich immer eine NullPointer Exception erhalte:

Code:
package zeichne;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
        
public class Main extends JFrame{
    
    DrawPanel canvas = new DrawPanel();    
    
    public Main() {
        super("Fenster!");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200,200);
        JPanel pane = new JPanel();
        pane.add(canvas);
        add(pane);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        Main ausgabe = new Main();
        ausgabe.canvas.paint(10,80,10,80);
    }
    
    class DrawPanel extends JPanel {

        private Object g;
        
        public DrawPanel(){
            
        }

        protected void paint(int x1, int x2, int y1, int y2) {
            Graphics2D g2 = (Graphics2D)g;
            g2.drawLine(x1,y1,x2,y2);
        }

    }
    
}

Vielen Dank für eure Hilfe
 
Code:
Exception in thread "main" java.lang.NullPointerException
        at zeichne.Main$DrawPanel.paint(Main.java:37)
        at zeichne.Main.main(Main.java:25)

Danke für deine Mühe. Übrigens ist das Fenster sichtbar und leer.
 
Code:
    class DrawPanel extends JPanel {

        private Object g;
        
        public DrawPanel(){
            
        }

        protected void paint(int x1, int x2, int y1, int y2) {
            Graphics2D g2 = (Graphics2D)g;
            g2.drawLine(x1,y1,x2,y2);
        }

    }
    
}

Ganz einfach: Du hast private Object g; nicht initialisiert und dennoch verwendest du sie in deiner paint Methode. Du versuchst also NULL in ein Graphics2D Objekt zu konvertieren
 
Hallo,

versuch es mal hiermit

Code:
class DrawPanel extends JPanel {

        private int x1, x2,  y1,  y2;        
        public DrawPanel(){
            
        }

        protected void paint(int x1, int x2, int y1, int y2) {
            this.x1 = x1;
            this.x2 = x2;
            this.y1 = y1;
            this.y2 = y2;

        }

       public void paint(Graphics g){
            Graphics2D g2 = (Graphics2D)g;
            g2.drawLine(x1,y1,x2,y2);
       }  

}

MFG

zEriX
 
Hi, danke euch :) Der funktionierende Code schaut folgendermaasen aus:

Code:
package zeichne;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
        
public class Main extends JFrame implements ActionListener {
    
    JButton male = new JButton("Male");
        
    public Main() {
        super("Fenster!");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200,200);
        male.addActionListener(this); 
        JPanel pane = new JPanel();
        pane.add(canvas);
        pane.add(male);
        add(pane);
        setVisible(true);
    }
    
    private DrawPanel canvas = new DrawPanel();
    
    public static void main(String[] args){
        Main ausgabe = new Main();
    }

    public void actionPerformed(ActionEvent e) {
        
       canvas.paintComponent(0,900,0,900);
       
    }


class DrawPanel extends JPanel {

        int x1,x2,y1,y2;
        public DrawPanel(){
            
        }

        public void paintComponent(int x1, int x2, int y1, int y2) {
           this.x1 = x1;
           this.x2 = x2;
           this.y1 = y1;
           this.y2 = y2;
        }

       public void paintComponent(Graphics g){
           super.paintComponent(g);
           Graphics2D g2 = (Graphics2D)g;
           g2.setPaint(Color.red);
           g2.drawLine(x1,y1,x2,y2);
           repaint();
       }  

}
}
 
Mach das repaint in die andere paint()-Methode. Die Methode repaint ruft nämlich paint(Graphigs g) auf und diese paintComponent(). So wird es bei dir die ganze Zeit neu gezeichnet und das kostet Performance.

MFG

zEriX
 
Zurück