Rysowanie po kliknięciu na buton

Odpowiedz Nowy wątek
2007-06-18 21:54
Scorpio
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.

Pozostało 580 znaków

2007-06-18 22:31
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

Pozostało 580 znaków

2007-06-18 22:47
Scorpio
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);
        }
    }
}

Pozostało 580 znaków

2007-06-19 00:28
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                     
                    }
    
                });
  4. a gdzie repaint() w actPref() naszego guzika...?

pzdr.


...trafiłem do źródła wiedzy bez drogowskazu...

Pozostało 580 znaków

2007-06-19 09:28
Scorpio
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.

Pozostało 580 znaków

2007-06-19 09:42
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.

Pozostało 580 znaków

2007-06-19 10:05
Scorpio
0

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

Pozostało 580 znaków

2007-06-19 10:20
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;
//....
}

Pozostało 580 znaków

2007-06-19 11:37
Scorpio
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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