Graphics -> Graphics2D etwas zu beachten?

Boikot

Mitglied
Hallo alle! Erste nachricht hier...

Ich lerne gerade Graphische Elemente zu programmieren. Mir Graphics g hat bisher alles geklappt, nun wenn ich elemente aus Graphics2D ersetze dann scheint das nicht zu funktionieren. Muss ich irgendwas beachten, werden sie nicht gleich angewandt?

Das ist der Code. Da wo Graphics2D steht, stand vorher nur Graphics, und da wo das Shape ist, war vorher einfach ein drawOval. Ich habs knallhart ersetzt, was muss ich beachten?

Java:
package proj;
import java.awt.Color;
import java.awt.geom.*;
import java.awt.Graphics2D;
import java.awt.Shape;

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

public class proj extends JPanel{
  
public void paintComponent(Graphics2D g){
   super.paintComponent(g);
   g.setColor(Color.BLACK);
   Shape k1 = new Ellipse2D.Float(100.0f,100.0f,100.0f,100.0f);
   g.draw(k1);
  
}


public static void main(String[] args){
   proj t = new proj();
  
   JFrame jf = new JFrame();
   jf.setTitle("New JFrame");
   jf.setSize(800, 600);//breite, höhe
   jf.setVisible(true);
   jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   jf.add(t);
}
}
Danke im vorraus!
 
Zuletzt bearbeitet von einem Moderator:
Was genau ist dein Problem?
Ich denke, du mußt den AWT-Graphikkontext (Graphics) zum Java2D-Kontext (Graphics2D) casten:

Java:
@Override
public void paintComponent(Graphics graph0)
{
   super.paintComponent(graph0);
   Graphics2D graph = (Graphics2D) graph0;
   graph.setColor(Color.BLACK);
   Shape k1 = new Ellipse2D.Float(100.0f,100.0f,100.0f,100.0f);
   graph.draw(k1);
}
So hat es jedenfalls bei mir funktioniert.
 
Sorry wegen Code-Tags 🙂

Keine fehlermeldung, es wird nur nichts im JFrame gezeichnet.
Danke Schmetterhand, das war es!!
Ich werd mich mal informieren was das genau macht, ich versteh es zwar nicht, aber es funktioniert 🙂
 
wenn du Graphics2D als Parameter in der Methode paintComponent verwendest, überschreibst du nicht mehr die ursprüngliche paintCopmonents(Graphics g), und erstellst eine komplett neue Methode, die niergends aufgerufen wird.
 
Jein, du fügst es damit einer internen Liste vom JFrame hinzu. Wenn das JFrame neu gezeichnet werden muss, ruft es bei jedem seiner Komponenten paintComponent() auf.
 
Ah, verstehe... Danke nochmal für die Kentnisse, mit den würd ich nicht auf diese probleme kommen. Ich habe ein timer hinzugefügt, und möchte bei jedem tick eine berechnung durchführen und dementsprechend neu zeichnen. Jetzt hab ich das problem das er meckert, ich glaube ich habe es in der falschen Zeile hinzugefügt.

Kannst du drüber schauen ob du ein Fehler findest? Kurzfassung meines Ziels: Ein fixes massenpunkt (o), ein bewegliches massenpunkt(a). Je nach abstand(r) soll sich das bewegliche teil mehr oder weniger beschleunigen. Dafür muss ich bei jedem tick erstmal der abstand berechnen.


Code:
import java.awt.Color;
import java.awt.geom.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Gravity extends JPanel implements ActionListener {

    private static final long serialVersionUID = 1L;
   
    public pkt i;
    public pkt j;
    public pkt res;
    private double uno;
    private double dos;
    private double betrag;
   
    Timer tm = new Timer(25,this);
    double grav = 2.0;
    double x = 20.0;
    double y = 500.0;
   
    double dx = 10.0;
    double dy = -10.0;
   
    double ddx = 0.0;
    double ddy = 0.0;
   
    double r;
    pkt o = new pkt(600.0,400.0);
    pkt a = new pkt(x,y);
    //double ret = o.ausx();
   
    //operate abs = new operate(o,a);
   
   

    @Override
public void paintComponent(Graphics graph0){
       
    super.paintComponent(graph0);
    Graphics2D graph = (Graphics2D) graph0;
    graph.setColor(Color.BLACK);
    Shape k1 = new Ellipse2D.Double(x,y,50.0,50.0);
    Shape origin = new Ellipse2D.Double(600.0,400.0,20.0,20.0);
    graph.draw(k1);
    graph.draw(origin);
    tm.start();
   
}

public void actionPerformed(ActionEvent e){
    r = abstand(o,a); //////////////////Diese Zeile ist das einzige Problem, wo soll sie hin?
    //dx = dx + ddx;
    x = x + dx;
    //dy= dy + ddy;
    y = y + dy;
   
    //System.out.println(r);
    repaint();
}

public static void main(String[] args){
    Gravity t = new Gravity();
   
    JFrame jf = new JFrame();
    jf.setTitle("New JFrame");
    jf.setSize(1200, 800);//breite, höhe
    jf.setVisible(true);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.add(t);
   
}

public double abstand(pkt i, pkt j){
    uno = i.x;
    dos = j.x;
    res.x = uno - dos;
   
    uno = i.y;
    dos = j.y;
    res.y = uno - dos;
   
    betrag = Math.sqrt(res.x*res.x+res.y*res.y);
    return betrag;
}

}

Ich weiß es ist ein Aufwand, tausend mal Danke!
 

Zurück
Oben