Rysowanie po kliknieciu (Rzut ukosny)

0

Wie ktos moze jak zrobic by po nacisnieciu klawisza rzuc narysowac cos na panelu o nazwie wykres.
Program bedzie (mam nadzieje ze skoncze) symulacja rzutu ukosnego.Napisalem go kiedys w c++ i chcialbym przepisac na jave ale utknelem z tym rysowaniem :/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RzutUkosny extends JFrame implements ActionListener {

	public void actionPerformed(ActionEvent e) {
		System.out.println("Dzialam");

	}

	JFrame frame;

	JButton rzuc = new JButton("Rzuć");

	JPanel wykres = new JPanel();

	JPanel panel = new JPanel();

	JPanel butto = new JPanel();

	JPanel parametry = new JPanel();

	Container cp = getContentPane();

	public RzutUkosny() {

		frame = new JFrame("Syulacja rzutu ukosnego");
		frame.setSize(600, 400);
		panel.setLayout(new BorderLayout());
		frame.getContentPane().add(panel);
		rzuc.setFont(new Font("Helvetica", 0, 11));
		rzuc.setToolTipText("Start symulacji");
		//Slider1 - ustawienia
		JLabel sliderLabel = new JLabel("Ustaw Prędkosc", JLabel.CENTER);
		sliderLabel.setFont(new Font("Helvetica", 0, 11));
		JSlider predkoscPoczatkowa = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
		predkoscPoczatkowa.setFont(new Font("Helvetica", 0, 11));
		predkoscPoczatkowa.setMajorTickSpacing(50);
		predkoscPoczatkowa.setMinorTickSpacing(10);
		predkoscPoczatkowa.setPaintTicks(true);
		predkoscPoczatkowa.setPaintLabels(true);
		predkoscPoczatkowa.setBackground(new Color(164, 223, 247));
		predkoscPoczatkowa.setToolTipText("Ustaw prędkosc początkową (km/h)");
		//Slider2 - ustawienia
		JLabel slider2Label = new JLabel("Ustaw Kąt", JLabel.CENTER);
		slider2Label.setFont(new Font("Helvetica", 0, 11));
		JSlider kat = new JSlider(JSlider.HORIZONTAL, 0, 90, 45);
		kat.setMajorTickSpacing(45);
		kat.setMinorTickSpacing(10);
		kat.setPaintTicks(true);
		kat.setPaintLabels(true);
		kat.setBackground(new Color(164, 223, 247));
		kat.setToolTipText("Ustaw kąt wyrzutu (stopnie)");
		//Panel wykresu - ustawienia
		wykres.setLayout(new BorderLayout());
		wykres.setBackground(new Color(255, 255, 255));
		wykres.setPreferredSize(new Dimension(0, 250));
		wykres.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		//Penel parametrow -  ustawienia
		parametry.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		parametry.setBackground(new Color(164, 223, 247));
		parametry.setPreferredSize(new Dimension(0, 100));
		parametry.setLayout(new GridLayout(2, 3));
		parametry.add(sliderLabel);
		parametry.add(slider2Label);
		parametry.add(butto);
		parametry.add(predkoscPoczatkowa);
		parametry.add(kat);
		butto.setBackground(new Color(164, 223, 247));
		butto.add(rzuc);

		panel.add(parametry, BorderLayout.SOUTH);

		Panelik wykres = new Panelik();
		wykres.setBackground(Color.white);

		panel.add(wykres);
		rzuc.addActionListener(this);

		frame.setVisible(true);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});


	}

	public static void main(String args[]) {
		RzutUkosny nowy = new RzutUkosny();

	}

}

class Panelik extends JPanel {

	Graphics d;

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		//Rysowanie wykresu

		g.setColor(Color.black);
		g.drawLine(580, 250, 20, 250);
		g.drawLine(20, 20, 20, 250);
		g.drawLine(15, 30, 20, 20);
		g.drawLine(25, 30, 20, 20);
		g.drawLine(570, 255, 580, 250);
		g.drawLine(570, 245, 580, 250);

		Font font = new Font("Helvetica", 0, 11);
		g.setFont(font);
		g.drawString("x", 10, 20);
		g.drawString("y", 570, 265);

	}

	public void rysuj() {

	}

}
0

no jesli juz to rysuj musi posiadac dostep do Graphics.
proponuje abys dodal ActionListenera do buttona, w ktorym wywolasz metode repaint();

w przeslonietej metodzie paintComponent(Graphics g) narysujesz wykres, a na samym koncu wywolaj Twoja metode rysuj(g);


public vouid rysuj(Graphics g){
 g.rysujCos();
}

pozdrawiam

0

Zrobilem cos takiego.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RzutUkosny extends JFrame implements ActionListener {

	
	public void actionPerformed(ActionEvent e) {
		repaint();
		System.out.println("Wywolalem repaint");
		
		}

	JFrame frame;

	JButton rzuc = new JButton("Rzuć");

	JPanel wykres = new JPanel();

	JPanel panel = new JPanel();

	JPanel butto = new JPanel();

	JPanel parametry = new JPanel();

	Container cp = getContentPane();

	public RzutUkosny() {

		frame = new JFrame("Syulacja rzutu ukosnego");
		frame.setSize(600, 400);
		panel.setLayout(new BorderLayout());
		frame.getContentPane().add(panel);
		rzuc.setFont(new Font("Helvetica", 0, 11));
		rzuc.setToolTipText("Start symulacji");
		//Slider1 - ustawienia
		JLabel sliderLabel = new JLabel("Ustaw Prędkosc", JLabel.CENTER);
		sliderLabel.setFont(new Font("Helvetica", 0, 11));
		JSlider predkoscPoczatkowa = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
		predkoscPoczatkowa.setFont(new Font("Helvetica", 0, 11));
		predkoscPoczatkowa.setMajorTickSpacing(50);
		predkoscPoczatkowa.setMinorTickSpacing(10);
		predkoscPoczatkowa.setPaintTicks(true);
		predkoscPoczatkowa.setPaintLabels(true);
		predkoscPoczatkowa.setBackground(new Color(164, 223, 247));
		predkoscPoczatkowa.setToolTipText("Ustaw prędkosc początkową (km/h)");
		//Slider2 - ustawienia
		JLabel slider2Label = new JLabel("Ustaw Kąt", JLabel.CENTER);
		slider2Label.setFont(new Font("Helvetica", 0, 11));
		JSlider kat = new JSlider(JSlider.HORIZONTAL, 0, 90, 45);
		kat.setMajorTickSpacing(45);
		kat.setMinorTickSpacing(10);
		kat.setPaintTicks(true);
		kat.setPaintLabels(true);
		kat.setBackground(new Color(164, 223, 247));
		kat.setToolTipText("Ustaw kąt wyrzutu (stopnie)");
		//Panel wykresu - ustawienia
		wykres.setLayout(new BorderLayout());
		wykres.setBackground(new Color(255, 255, 255));
		wykres.setPreferredSize(new Dimension(0, 250));
		wykres.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		//Penel parametrow -  ustawienia
		parametry.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		parametry.setBackground(new Color(164, 223, 247));
		parametry.setPreferredSize(new Dimension(0, 100));
		parametry.setLayout(new GridLayout(2, 3));
		parametry.add(sliderLabel);
		parametry.add(slider2Label);
		parametry.add(butto);
		parametry.add(predkoscPoczatkowa);
		parametry.add(kat);
		butto.setBackground(new Color(164, 223, 247));
		butto.add(rzuc);

		panel.add(parametry, BorderLayout.SOUTH);

		Panelik wykre = new Panelik();
	
		
		wykre.setBackground(Color.white);

		panel.add(wykre);
		rzuc.addActionListener(this);

		frame.setVisible(true);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		


	}

	public static void main(String args[]) {
		RzutUkosny nowy = new RzutUkosny();

	}

}

class Panelik extends JPanel {



	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		//Rysowanie wykresu

		g.setColor(Color.black);
		g.drawLine(580, 250, 20, 250);
		g.drawLine(20, 20, 20, 250);
		g.drawLine(15, 30, 20, 20);
		g.drawLine(25, 30, 20, 20);
		g.drawLine(570, 255, 580, 250);
		g.drawLine(570, 245, 580, 250);

		Font font = new Font("Helvetica", 0, 11);
		g.setFont(font);
		g.drawString("x", 10, 20);
		g.drawString("y", 570, 265);
		rysuj(g);

	}

	public void rysuj(Graphics g) {
	
			 g.drawString("cos", 200, 100);
	}

}

Albo zrobilem zle, albo to nie ma tak dzialac :/
Chodzi mi o to ze po nacisnieciu buttona ruszy mi symulacja rzutu.Chce to przetestowac narysowaniem czegokolwiek po kliknieciu :/ cos mi nie idzie :|

Mimo wszystko dziekuje za zainteresowanie.

Pozdrawiam.

0

A ja dalej w tym bagnie siedzę ;-P pomyślałem ze ma ktoś może jakiś gotowy przykład programu symulującego rzut ukośny w Javie ? Nie chodzi mi tutaj o zrobienie jakiegoś plagiatu... po prostu o zasadę, rozwiązanie problemu z tym rysowaniem w panelu po kliknięciu czy jakimkolwiek zdarzeniu.

//nie edytowałem postu żeby odswieżyc temat

0

na szybko, pisane z palca

class Rysownik extends Thread{
   private Graphics2D g2;
   public Rysownik(Graphics g){
      g2=(Graphics2D)g
   }
   public void run(){
         for(int i=0;i<100,i++){
            g2.setColor(Color.RED);
            g2.drawLine(i,i,i+1,i+1);
         }
   }

class MojPanel extends JPanel{
        private PanelRysowania prys;
        public MojPanel(){
            setLayout(new BorderLayout());
            prys=new PanelRysowania();         
            JButton button=new JButton("start");
            button.addActionListener(new ActionListener(){
                     public void actionPerformed(ActionEvent e){
                            prys.setShoudPaint(!prys.getShoulPaint());
                     }
            });
            add(button,BorderLayout.NORTH);
            add(prys,BorderLayout.CENTER);

         }
}

class PanelRysowania extends JPanel{
        private boolean shouldPaint;
        public PanelRysowania(){
            shouldPain=false;
        }
        public void paintComponent(Graphics g){
                if (sholudPaint==true)
                     new Rysownik(g).start();
        }
        public void setShouldPaint(boolean b){
               shouldPaint=b;
               repaint();
        }
        public boolean getShouldPaint(){
               return shouldPaint;
        }

}

pozdrawiam

0

Dziekowac eximius. Jestes Wielki ;-)

Kod mam na linuxie a siedze teraz na windowsie. Jesli ktos chce to moge zamiescic.

0

nie ma sprawy, a setColor wywal przed petle, bo bez sensu jest wywolywany
aby sprawic, zeby rysowanie sprawialo wrazenie animacji dodaj w petli

try{
    sleep(10);
}catch(Exception e){
    interrupt();
}

mam nadzieje, ze nie zrobilem literowek, bo jak mowilem pisalem z palca...

pozdrawiam

0

To znowu ja :D Kierujac sie uwagami eximusa udalo mi sie narysowac wykres, ale jego animacja byla niemozliwa wiec probuje teraz zrobic prawie identycznie jak eximus, no i cos nie dziala.

public void run() {
			for (t = 0; t < DajTu(); t++) {
				System.out.println("siema");
				g2.drawOval(ObliczWx(t) + 20, ObliczWy(t) + 245, 3, 3);
			}

		}
	}

	class Panelik extends JPanel {

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			if (flaga == true) {
				System.out.println("Flaga = true");
				// Rysowanie wykresu
				g.setColor(Color.black);
				g.drawLine(580, 250, 20, 250);
				g.drawLine(20, 20, 20, 250);
				g.drawLine(15, 30, 20, 20);
				g.drawLine(25, 30, 20, 20);
				g.drawLine(570, 255, 580, 250);
				g.drawLine(570, 245, 580, 250);

				Font font = new Font("Helvetica", 0, 11);
				g.setFont(font);
				g.drawString("x", 10, 20);
				g.drawString("y", 570, 265);
			}
			if (flaga == false) {

				String x = Double.toString(DajTu());
				System.out.println("Flaga = flase");

				// Rysowanie wykresu
				g.setColor(Color.black);
				g.drawLine(580, 250, 20, 250);
				g.drawLine(20, 20, 20, 250);
				g.drawLine(15, 30, 20, 20);
				g.drawLine(25, 30, 20, 20);
				g.drawLine(570, 255, 580, 250);
				g.drawLine(570, 245, 580, 250);
				Font font = new Font("Helvetica", 0, 11);
				g.setFont(font);
				g.drawString("x", 10, 20);
				g.drawString("y", 570, 265);
				// Symulacja lot
				new Rysownik(g).start();
                      }
		}
	}

Napis 'siema' sie wyswietla, ale wykres sie nie rysuje :/ a jesli petle dawalem w tym miejscu, wszysto dziala ok.

if (flaga == false) {

				String x = Double.toString(DajTu());
				System.out.println("Flaga = flase");

				// Rysowanie wykresu
				g.setColor(Color.black);
				g.drawLine(580, 250, 20, 250);
				g.drawLine(20, 20, 20, 250);
				g.drawLine(15, 30, 20, 20);
				g.drawLine(25, 30, 20, 20);
				g.drawLine(570, 255, 580, 250);
				g.drawLine(570, 245, 580, 250);
				Font font = new Font("Helvetica", 0, 11);
				g.setFont(font);
				g.drawString("x", 10, 20);
				g.drawString("y", 570, 265);
				// Symulacja lotu
				for (t = 0; t < DajTu(); t++) {
				g.drawOval(ObliczWx(t) + 20, ObliczWy(t) + 245, 3, 3);
			        }
			}

0

czy u Ciebie ten panelik znajduje sie wewnatrz klasy Rysownik? daj wiecej kodu...
na pierwszy rzut oka jesli Twoja klasa extends JPanel, to zrob klase wewnetrzna Rysownik extends Thread, bedzie ladniej wygladalo (jeden zakres odpowiedzialnosci na klase)

pozdrawiam

0

W takim razi moze pokaze caly kod :

/*
     * Program:Symulacja rzutu ukosnego
     * 
     *  
	 * Vo-predkosc poczatkowa; 
	 * Vx - polozenie punktu na osi X w czasie t ; 
	 * Vy -polozenie punktu na osi Y w czasie t 
	 * Tu - calkowity czas lotu 
	 * katv - kat wyrzutu 
	 * t - czas
	 * Wx - wspolrzedna punktu X
	 * Wy - wspolrzedna punktu Y
	 * q - przyciaganie ziemskie
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RzutUkosny extends JFrame {

	JFrame frame;

	JSlider predkoscPoczatkowa = new JSlider(JSlider.HORIZONTAL, 0, 200, 100);

	JSlider kat = new JSlider(JSlider.HORIZONTAL, 0, 90, 45);

	Panelik wykre = new Panelik();

	JButton rzuc = new JButton("Rzuc");

	JPanel wykres = new JPanel();

	JPanel panel = new JPanel();

	JPanel butto = new JPanel();

	JPanel parametry = new JPanel();

	Container cp = getContentPane();

	int Vo = predkoscPoczatkowa.getValue();

	int katv = kat.getValue();

	int Vx, Vy, Tu, t, Wx, Wy;

	double q = 9.80;

	boolean flaga = true;

	

	public RzutUkosny() {

		frame = new JFrame("Syulacja rzutu ukosnego");
		wykre.setBackground(Color.white);
		frame.setSize(600, 400);
		panel.setLayout(new BorderLayout());
		frame.getContentPane().add(panel);
		rzuc.setFont(new Font("Helvetica", 0, 11));
		rzuc.setToolTipText("Start symulacji");
		// Slider1 - ustawienia
		JLabel sliderLabel = new JLabel("Ustaw Predkosc", JLabel.CENTER);
		sliderLabel.setFont(new Font("Helvetica", 0, 11));
		predkoscPoczatkowa.setFont(new Font("Helvetica", 0, 11));
		predkoscPoczatkowa.setMajorTickSpacing(50);
		predkoscPoczatkowa.setMinorTickSpacing(10);
		predkoscPoczatkowa.setPaintTicks(true);
		predkoscPoczatkowa.setPaintLabels(true);
		predkoscPoczatkowa.setBackground(new Color(164, 223, 247));
		predkoscPoczatkowa.setToolTipText("Ustaw predkosc poczatkowa (km/h)");
		// Slider2 - ustawienia
		JLabel slider2Label = new JLabel("Ustaw Kat", JLabel.CENTER);
		slider2Label.setFont(new Font("Helvetica", 0, 11));
		kat.setMajorTickSpacing(45);
		kat.setMinorTickSpacing(10);
		kat.setPaintTicks(true);
		kat.setPaintLabels(true);
		kat.setBackground(new Color(164, 223, 247));
		kat.setToolTipText("Ustaw kat wyrzutu (stopnie)");
		// Panel wykresu - ustawienia
		wykres.setLayout(new BorderLayout());
		wykres.setBackground(new Color(255, 255, 255));
		wykres.setPreferredSize(new Dimension(0, 250));
		wykres.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		// Penel parametrow - ustawienia
		parametry.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		parametry.setBackground(new Color(164, 223, 247));
		parametry.setPreferredSize(new Dimension(0, 100));
		parametry.setLayout(new GridLayout(2, 3));
		parametry.add(sliderLabel);
		parametry.add(slider2Label);
		parametry.add(butto);
		parametry.add(predkoscPoczatkowa);
		parametry.add(kat);
		butto.setBackground(new Color(164, 223, 247));
		butto.add(rzuc);

		rzuc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Vo = predkoscPoczatkowa.getValue();
				katv = kat.getValue();
				ObliczVx();
				ObliczVy();
				ObliczTu();
				flaga = !flaga;
				wykre.repaint();

			}

		});

		panel.add(parametry, BorderLayout.SOUTH);
		panel.add(wykre);

		frame.setVisible(true);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

	}



	class Panelik extends JPanel {
		
		
		class Rysownik extends Thread {
			private Graphics2D g2;

			public Rysownik(Graphics g) {
				g2 = (Graphics2D) g;
			}

			public void run() {
				for (t = 0; t < DajTu(); t++) {
					System.out.println("siema");
					g2.drawOval(ObliczWx(t) + 20, ObliczWy(t) + 245, 3, 3);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {

						e.printStackTrace();
					}
				}

			}
		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			if (flaga == true) {
				System.out.println("Flaga = true");
				// Rysowanie wykresu
				g.setColor(Color.black);
				g.drawLine(580, 250, 20, 250);
				g.drawLine(20, 20, 20, 250);
				g.drawLine(15, 30, 20, 20);
				g.drawLine(25, 30, 20, 20);
				g.drawLine(570, 255, 580, 250);
				g.drawLine(570, 245, 580, 250);

				Font font = new Font("Helvetica", 0, 11);
				g.setFont(font);
				g.drawString("x", 10, 20);
				g.drawString("y", 570, 265);
			}
			if (flaga == false) {

				String x = Double.toString(DajTu());
				System.out.println("Flaga = flase");

				// Rysowanie wykresu
				g.setColor(Color.black);
				g.drawLine(580, 250, 20, 250);
				g.drawLine(20, 20, 20, 250);
				g.drawLine(15, 30, 20, 20);
				g.drawLine(25, 30, 20, 20);
				g.drawLine(570, 255, 580, 250);
				g.drawLine(570, 245, 580, 250);
				Font font = new Font("Helvetica", 0, 11);
				g.setFont(font);
				g.drawString("x", 10, 20);
				g.drawString("y", 570, 265);
				// Symulacja lot
				new Rysownik(g).start();
				System.out.println("Rysuje");

			}

		}
	}

	// Funkcje liczace paramtry wymagane do przeprowadzenia symulacji

	int dajVo() {
		return Vo;
	}

	void ObliczVx() {
		Vx = (int) Math.ceil(Vo * Math.cos(katv * Math.PI / 180));
	}

	void ObliczVy() {
		Vy = (int) Math.ceil(Vo * Math.sin(katv * Math.PI / 180) - (q * t));
	}

	void ObliczTu() {
		Tu = (int) Math.ceil((2 * Vy) / q);
	}

	int ObliczWx(int t) {
		return (int) (Math.ceil((Vo * t * Math.cos(katv * Math.PI / 180)) / 10));
	}

	int ObliczWy(int t) {
		return (int) (Math
				.ceil((Vo * t * Math.sin(katv * Math.PI / 180) - (q / 2)
						* (t * t))
						/ -10));
	}

	int ObliczZasieg() {
		return (int) (((2 * (Vo * Vo)) * Math.sin(katv * Math.PI / 180) * Math
				.cos(katv * Math.PI / 180)) / q);
	}

	int ObliczHmax() {
		return (int) ((Vy * Vy) / (2 * q));
	}

	float DajKat() {
		return katv;
	}

	float DajVo() {
		return Vo;
	}

	float DajVx() {
		return Vx;
	}

	float DajVy() {
		return Vy;
	}

	float DajTu() {
		return Tu;
	}

	// Main :)

	public static void main(String args[]) {
		RzutUkosny nowy = new RzutUkosny();

	}

}

Zrobilem klase Rysownik jako wewnetrzna klasy Panelik - zadnych zmian, naprawde bardzo dziwne, niby Rysownik ma jako parametr obiekt g z klasy Panelik i nie rysuje :-( Probowalem na rozne sposoby kombinowac z implementacja Runnable w klasie Panelik, ale run nie chce dzialac tam gdzie powinien :/

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