AWT rysowanie

0

Finalnie ma być to program liczący i ilustrujący rzut ukośny jaki zapewne z fizyki pamiętacie. Na razie program składa się z 3 klas. GUI odpowiadające za wygląd programu, RzutUkosny będący główną klasą oraz Rzut gdzie znajduje się zmienne i metody obliczeń zmiennych.
Problem polega aktualnie na tym, że chciałem narysować osie układu jako początek rzutu i niestety nie wiem gdzie błąd jest ponieważ kompilator nie znajduje ale nic się nie rysuje.
Za rysowanie osi odpowiada funkcja rysujWykres()
a cały kod:

RzutUkosny

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rzutukosny;
import java.awt.*;

/**
 *
 * @author Michal
 */
public class RzutUkosny {

   
    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
      GUI g = new GUI();
      g.setVisible(true);
      
    Rzut rzut = new Rzut();
   
    rzut.setV0x(10);
    rzut.setT(5);
    rzut.odlegloscX1();
    System.out.println(rzut.getX());
    
  rzut.rysujWykres();
    
    
    int o;
    int m = o =6 ;
    System.out.println(o+","+ m);

        
    }
}

Rzut:

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rzutukosny;
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
/**
 *
 * @author Michal
 */
 class Rzut {
  
    // //dodac prawdziwy konstruktor
    private double V0;
    private double V0x;
    private double V0y;
    private double x1; // o
    private double y1;
    private double t;
    private final double GN = 9.80665;
    private double Hmax;
    //zmienne inne
   
    
    
   public void rysujWykres() {
       GUI p = new GUI();
       
       p.setRysuj((java.awt.Graphics) p.getjPanel1().getGraphics());
       //  rysuj = (java.awt.Graphics) jPanel1.getGraphics();
    Color kolor = java.awt.Color.red; //wybór koloru
   // rysuj.setColor(kolor); //wstawienie koloru
    p.getRysuj().setColor(kolor);
    p.getRysuj().drawLine(20, 20, 100, 100);
    p.getRysuj().drawOval(50, 50, 30, 30);
    
   }
   

    public double odlegloscX1(){
        x1=  V0x * t;
        return x1;
    }
    
    public double odlegloscY1(double V0yy, double tt){
        y1= V0y*t-((GN*Math.pow(t, 2))/2);
        return y1;
    }
    
    public double odlegloscY1(double V0y, double x1, double V0x){
        y1= V0y*(x1/V0x)-((GN*Math.pow(x1/V0x, 2))/2);
    return y1; 
 }
    
    
    
    public double getX() {
        return x1;
    }

    public void setX(double x1) {
        this.x1 = x1;
    }

    public double getV0() {
        return V0;
    }

    public void setV0(double V0) {
        this.V0 = V0;
    }

    public double getV0x() {
        return V0x;
    }

    public void setV0x(double V0x) {
        this.V0x = V0x;
    }

    public double getV0y() {
        return V0y;
    }

    public void setV0y(double V0y) {
        this.V0y = V0y;
    }

    public double getT() {
        return t;
    }

    public void setT(double t) {
        this.t = t;
    }

    public double getHmax() {
        return Hmax;
    }

    public void setHmax(double Hmax) {
        this.Hmax = Hmax;
    }

    public double getX1() {
        return x1;
    }

    public void setX1(double x1) {
        this.x1 = x1;
    }

    public double getY1() {
        return y1;
    }

    public void setY1(double y1) {
        this.y1 = y1;
    }
    
    
    public void rzut(){
        V0=0;
        V0x=0;
        V0y = 0;
        t =0;
        x1=0;
        y1=0;
        Hmax=0;
        
    }
    
}

klasa GUI jest głównie tworzona przez edytor Netbeansa więc żeby nie śmiecić tylko jej fragment:
private java.awt.Graphics rysuj;

  public Graphics getRysuj() {
        return rysuj;
    }

    public void setRysuj(Graphics rysuj) {
        this.rysuj = rysuj;
    }
public JPanel getjPanel1() {
        return jPanel1;
    }

    public void setjPanel1(JPanel jPanel1) {
        this.jPanel1 = jPanel1;
    }

 
0

Za rysowanie powinna odpowiadać (nadpisana) metoda paint(Graphics g) panelu.

0

właśnie tutaj mam problem bo nie wiem jak to nadpisać korzystając z Netbeansa, wszystkie przykłady jakie widziałem nadpisywały metody w klasach, a jak twprze jPanel w Netbeasie edytorem to nie mam tej klasy i nie wiem jak nadpisać;/

0

nie wiem jak nadpisać

Normalnie, tak jak w Eclipsie czy zwykłym notatniku.

  1. Robisz klase pochodną moja klasa dziedziczącą po jpanel i
    1.1) piszesz @Override(ale bez tego tez przejdzie) public void paint(Graphics g) { i tutaj sobie robisz rysowanie} np
public class Moja_genialnie_rysujaca_klasa extends JPanel
{
@Override
public void paint(Graphics g) 
{
//TODO: genialna metoda rysująca tutaj!
}
}

1.2) klikasz prawym na pustym miejscu w kodzie klasy pochodnej, insert code-> override method-> public void paint() i tak sobie to wyklikasz
2)
W razie jakbyś dodawał jakiś tam panel do powiedzmy forma, to jak go bedziesz tworzył robisz anonimowego dziedzica (nie nie, to nie jest programistyczne określenie :P prawidłowo by było anonimowa klasa pochodna, ale co tam ;P) np

JPanel super_rysujacy_panel=new JPanel()
{ 
@Override
public void paint(Graphics g)
{
 // TODO: RYSOWANIE KURDE TUTAJ ;]
}
}

a tak ze swojej strony, proponuje zrobić drugą klasę która dziedziczy po Component, i tam sobie nadpisać painta. Dlaczego? No jpanel bedzie cieższy, a z racji tego, że nadpiszesz sobie painta to i tak żadne childy nie będą rysowane (musiałbyś rysowanie w paintComponent robić)
ot i cała filozofia :)

0

Dzięki za rozpisanie się:) ale nadal mam problem;/
Rozumiem, że punkt 1.2 jest opcjonalny jeżeli nie dodam @overide pisząc po prostu

Co do punktu 2 to nie wiem w ogóle gdzie to wpisać i skąd i jak mam kazać żeby się rysowało po jPanel1 albo jPanel2 (to tak przyszłościowo)

Jest też przykład z książki Core2 Java Podstawy:
tylko on tworzy z kodu panel a ja chce aby to jakoś wrzucić do panelu tworzonego z edytora Netbeansa

  public class Moja_klasa extends JPanel
  
{


    @Override
      public void paintComponent(Graphics G){
          super.paintComponent(G);
          Graphics2D g2 = (Graphics2D)G;
          
          Rectangle2D pros = new Rectangle2D.Double(50, 50, 30, 30);
          g2.draw(pros);
                    
          
      } 
0

Ogólnie udało mi się rysować ale bo "wykodzonym" panelu a nie stworzonym przez edytor:
klasa rysujaca

  public class Moja_klasa extends JPanel
  
{
      //private java.awt.Graphics rysuj;

    @Override
      public void paint(Graphics g){
        //Ractangle2D p = new Ractangle2D.
        g.setColor(Color.red);
    g.drawLine(40, 40, 100, 100);
        
        
    } 

dopisanie do konstruktora ramki:

 public GUI() {
         Moja_klasa k = new Moja_klasa();
         k.setSize(400, 400);
        Container powZawartosci = getContentPane();
        powZawartosci.add(k); 

Jednak chciałbym aby to robić na panelu stworzonym z edytora i tu mam problem
(nie zabardzo wiem gdzie ten 2 punkt z postu Antoniossss'a zastosować)

0

zupełnie tak jak to opisałem - nie musisz tworzyć nowej klasy pochodnej od panelu, ale możesz jakby nadpisać metodę bezpośrednio w klasie JPanel. Mówie tak jakby, bo nie tworzysz nowego pliku *.java z klasą (ale już po kompilacji będziesz miał dodatkowy plik *.class) tylko nadpisujesz jakby na żywca. Tak jak Ci podałem wyżej, to Twój kawałek kodu wyglądałby tak (mówie o tym kawałku gdzie jest Moja_klasa):

 public GUI() {
          // Tutaj miałeś coś takiego -> Moja_klasa k = new Moja_klasa();
         JPanel p=new JPanel()
            {
                @Override
                public void paint(Graphics g){
                 // To jest kod przeklejony z painta twojej klasy Moja_klasa :)
                g.setColor(Color.red);
                g.drawLine(40, 40, 100, 100);
            }
         k.setSize(400, 400);
        Container powZawartosci = getContentPane();
        powZawartosci.add(k); 

ot i będzie działało zupełnie tak samo, a mniej zamieszania, mniej kodu (o jedną linie i dwie klamry jhahahha :) ale na pewno jeden plik mniej :) Oba sposoby są dozwolone :D
Wadą tego rozwiązania jest to, że sobie z tej klasy nie skorzystasz gdzie indziej w projekcie. No ale powiedzmy szczerze. Jak klasa jest wypaśna to nikt w anonimy sie nie bedzie bawił, no a jak jest do podmiany taaaaaka wypasiooona metoda (sic!) jak tutaj, to (przynajmniej ja tak mam) nie ma co sie bawic w tworzenie nowych klas, strzelam anonima i wszystko dziala :)
Jak coś jeszcez nie jasne - pisz

0

Powinieneś nadpisywać metodę paintComponent, nie paint.

Paint jest odpowiedzialny też za rysowanie ramek i podkomponentów.
http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paint%28java.awt.Graphics%29

1 użytkowników online, w tym zalogowanych: 0, gości: 1