Rysowanie po kliknięciu na buton

0

Ponizej zamieszczam uproszczony aplet rysujacy romb.

package pl.wsb.students.pk;

import java.applet.Applet;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class test extends Applet implements ActionListener{
	int [] x = {50,350,562,262};
		int [] y = {100,100,312,312};
	int n= 4;
	Button przycisk = new Button("Rysuj");
	public void init() {
		add(przycisk1);
		przycisk.addActionListener(this);
	}
	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource()==przycisk){

		}
	}
	public void paint(Graphics g){
		g.drawPolygon(x, y, n);
	}
}

W chwili obecnej od razu wyrysowuje figure i wyswietla buton. Jak widac zostala napoczeta metoda "actionPerformed(ActionEvent ev)". Co nalezy w niej zmienic zeby metoda paint startowala dopiero po kliknieciu na buton "Rysuj". Nie mam za duzego doswiadczenia, a aplet musze stworzyc na zaliczenie. Chcialem zrobic cos takiego:

public void actionPerformed(ActionEvent ev) {
		if (ev.getSource()==przycisk){
			public void paint(Graphics g){
				g.drawPolygon(x, y, n);
		}
	}

Niestety nie da sie :-/
Bede wdzieczny za pomoc.

0
package pl.wsb.students.pk;

import java.applet.Applet;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class test extends Applet implements ActionListener{
        boolean bMoznaRysowac = false;
        int [] x = {50,350,562,262};
                int [] y = {100,100,312,312};
        int n= 4;
        Button przycisk = new Button("Rysuj");
        public void init() {
                add(przycisk1);
                przycisk.addActionListener(this);
        }
        public void actionPerformed(ActionEvent ev) {
                if (ev.getSource()==przycisk){
                     bMoznaRysowac = true;
                }
        }
        public void paint(Graphics g){
                if(bMoznaRysowac){
                      g.drawPolygon(x, y, n);
                 }
        }
}

Pisane z palca.
Pozdrawiam

0

Wielkie dzieki. Nie wiedzialem ze to az tak proste. Zmodyfikowalem odpowiednio rozszerzona wersje mojego apletu w ktorej moge wczytywac wartosc kata i dlugosc boku, ale niestety nic nie rysuje. Mozesz looknac???

package pl.wsb.students.pk;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Romb2 extends Applet implements ActionListener {
	int n = 4;

	int x1, y1, x2, y2, x3, y3, x4, y4;

	int[] x = { x1, x2, x3, x4 };

	int[] y = { y1, y2, y3, y4 };

	double alfa, beta, h, c;

	int bok;

	boolean rysuj = false;

	Label etykieta1 = new Label("Długość boku:");

	TextField pole1 = new TextField();

	Label etykieta2 = new Label("Wartość kąta:");

	TextField pole2 = new TextField();

	Button przycisk1 = new Button("Rysuj");

	public void init() {
		Panel panel = new Panel();
		panel.setLayout(new GridLayout(3, 3));
		panel.add(etykieta1);
		panel.add(etykieta2);
		panel.add(pole1);
		panel.add(pole2);
		panel.add(przycisk1);

		przycisk1.addActionListener(this);

		add(BorderLayout.NORTH, panel);

	}

	public void actionPerformed(ActionEvent ev) {
		alfa = Double.valueOf(pole2.getText());
		beta = (Math.PI * alfa) / (Math.PI / 2);
		x1 = 100;
		y1 = 600;
		bok = Integer.valueOf(pole1.getText());
		x2 = x1 + bok;
		y2 = y1;
		h = bok * Math.sin(beta);
		c = Math.sqrt(bok * bok - h * h);
		x3 = (int) (x2 + c);
		y3 = (int) (y2 + h);
		x4 = x3 - bok;
		y4 = y3;
		if (ev.getSource() == przycisk1) {
			rysuj = true;
		}
	}

	public void paint(Graphics g) {
		if (rysuj) {
			g.drawPolygon(x, y, n);
		}
	}
}
0
  1. masz puste tablice x i y, wypisz je sobie System.out.print(x[0]) czy cos w tym stylu
  2. jeżeli pobierasz liczby ze stringów to tak: bok = Integer.parseInt(pole1.getText());
  3. nie wiem czemu wiekszość ludzi, również i Ty stosujecie tą dziwna praktylę że całą klasa impementuje interfejs AtionListener, wg. mnie to strasznie gmatwa lod, bardziej elegancko jest zastosować anonimowe klasy wewnętrzne:
przycisk1.addActionListener(new ActionListener(){
                	public void actionPerformed(ActionEvent ev){
                		 //i tutaj jakieś akcje                		
                	}
                	
                });
  1. a gdzie repaint() w actPref() naszego guzika...?

pzdr.

0

A mozna tak (?):
zamiast:


        int[] x = { x1, x2, x3, x4 };

        int[] y = { y1, y2, y3, y4 };

dam:

int x [] = new int [4];
int y [] = new int [4];

Jesli tak sie da to w jaki sposob wypelnic tablice x i y. Czy mozna to zrobic w taki sposob:

x [] = {x1, x2, x3, x4};
y [] = {y1, y2, y3, y4};

Jak juz pisalem jestem poczatkujacy, wiec wybaczcie glupie bledy.


0

samo

int x [] = new int [4];
int y [] = new int [4];

niewystarczy bo tablice będą miały puste poszczególne pola. Jeżeli będziesz chiał z nich korzystać, bez wypełnienia, to już przy kompilacji polecą wyjątki.

zamiast:

x [] = {x1, x2, x3, x4};
y [] = {y1, y2, y3, y4};

użyj:

int x [] = new int[]{x1, x2, x3, x4};
int y [] = new int[]{y1, y2, y3, y4};

musisz mieć przecież typ określony.

0

Mozesz to wrzucic do kodu ktory podalem kilka postow wyzej. Probuje ale mi sie nie udaje.

0

Masz

        int n = 4;

        int x1, y1, x2, y2, x3, y3, x4, y4;

        int[] x = { x1, x2, x3, x4 };

        int[] y = { y1, y2, y3, y4 };

        double alfa, beta, h, c;

zamieniamy to na:

int x1, y1, x2, y2, x3, y3, x4, y4;
int[] x = new int[]{ x1, x2, x3, x4 };
int[] y = new int[]{ y1, y2, y3, y4 };

I teraz zamiast:

public void actionPerformed(ActionEvent ev) {
//...
       x1 = 100;
       y1 = 600;
//....
}

używasz tablic:

public void actionPerformed(ActionEvent ev) {
//...
       x[0] = 100;
       y[0] = 600;
//....
}
0

Dzieki wielkie wszysykim. Wasze rady okazaly sie nieocenione.
Wprowadzilem kilka modyfikacji, poniewaz nie dzialalo poprawnie przeliczanie na radiany. W tej chwili kod wyglada tak:

package pl.wsb.students.pk;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Romb2 extends Applet implements ActionListener {
	int n = 4;

	int x1, y1, x2, y2, x3, y3, x4, y4;

	int[] x = new int [] { x1, x2, x3, x4 };

	int[] y = new int [] { y1, y2, y3, y4 };

	double alfa, beta, h, c;

	int bok;

	boolean rysuj = false;

	Label etykieta1 = new Label("Długość boku:");

	TextField pole1 = new TextField();

	Label etykieta2 = new Label("Wartość kąta:");

	TextField pole2 = new TextField();

	Button przycisk1 = new Button("Rysuj");

	public void init() {
		Panel panel = new Panel();
		panel.setLayout(new GridLayout(3, 2));
		panel.add(etykieta1);
		panel.add(etykieta2);
		panel.add(pole1);
		panel.add(pole2);
		panel.add(przycisk1);

		przycisk1.addActionListener(this);

		add(BorderLayout.NORTH, panel);

	}

	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource() == przycisk1) {
		alfa = Integer.parseInt(pole2.getText());
		beta = Math.toRadians(alfa);
		x1 = 100;
		y1 = 100;
		x[0] = x1;
		y[0] = y1;
		bok = Integer.parseInt(pole1.getText());
		x2 = x1 + bok;
		y2 = y1;
		x[1] = x2;
		y[1] = y2;
		h = bok * Math.sin(beta);
		c = Math.sqrt(bok * bok - h * h);
		x3 = (int) (x2 + c);
		y3 = (int) (y2 + h);
		x[2] = x3;
		y[2] = y3;
		x4 = x3 - bok;
		y4 = y3;
		x[3] = x4;
		y[3] = y4;
		rysuj = true;
		repaint();
		}
	}

	public void paint(Graphics g) {
		if (rysuj) {
			g.drawPolygon(x, y, n);
		}
	}
}

Aplet dziala poprawnie i ladnie rysuje. Jeszcze raz dzieki wielkie wszystkim za pomoc.

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