problemi s paint() v applet

10 отговора 115 прегледа
#1

problemi s paint() v applet

Zdraweite!
Imam takyw problem: na edin applet sym slojil Label-i, tekstowi poleta i butoni. Kogato se natisne edinia buton, se 4ertaiat otkryjnosti po danni ot poletata. Pri natiskane na drugia posledowatelno triabwa da se iz4ertawat dopiratelni. I tuk e problemyt - pri iz4ertawaneto na wsiaka sledwa6ta dopiratelna se 4isti ekrana i ostanalite iz4ertani ne6ta iz4ezwat. Towa go biah pisal predi i si rabote6e, no PC-to se skapa i si zatrih koda. Sega prosto ne pomnia kakwo praweh. Ako niakoi moje da pomogne, mnogo 6te mu se zaradwam!

Отговор
в отговор на BadPainter #2

eto koda:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class SimplePoncelet extends Applet {
private static final Color middleGray = new Color(136,136,140);
private double rb,rs,d,x0=300,y0=250,x1=0,y1=0,x2,y2;
private boolean DCBtnClicked = false;
private boolean DTgBtnClicked = false;
private Button drawTgBtn;
private Button drawCirclesBtn;
private TextField tf_rb;
private TextField tf_rs;
private TextField tf_d;
private TextField tf_spx;

private BtnTgList btnTgList = new BtnTgList();
private BtnCircleList btnCircleList = new BtnCircleList();

public void init() {
drawTgBtn = new Button("Draw next tangent");
drawTgBtn.addActionListener(btnTgList);
drawCirclesBtn = new Button("Draw circles");
drawCirclesBtn.addActionListener(btnCircleList);
tf_rb = new TextField("150");
tf_rs = new TextField("50");
tf_d = new TextField("70");
tf_spx = new TextField("300");
add(new Label("rb ="));
add(tf_rb);
add(new Label("rs ="));
add(tf_rs);
add(new Label("d ="));
add(tf_d);
add(new Label("x ="));
add(tf_spx);
add(drawCirclesBtn);
add(drawTgBtn);
}

class BtnTgList implements ActionListener {
public void actionPerformed(ActionEvent e){
DTgBtnClicked = true;
repaint();
}
}

class BtnCircleList implements ActionListener {
public void actionPerformed(ActionEvent e){
DCBtnClicked = true;
repaint();
}
}

public void paint(Graphics g) {
if (DCBtnClicked) {
DCBtnClicked = false;
rb = Double.parseDouble(tf_rb.getText());
rs = Double.parseDouble(tf_rs.getText());
d = Double.parseDouble(tf_d.getText());
x1 = Double.parseDouble(tf_spx.getText());
y1 = 0;

g.setColor(Color.darkGray);
g.fillOval((int)(x0+d-1),(int)(y0-1),3,3);
g.drawOval((int)(x0+d-rb),(int)(y0-rb),(int)(2*rb),(int)(2*rb));

g.setColor(middleGray);
g.fillOval((int)(x0-1),(int)(y0-1),3,3);
g.drawOval((int)(x0-rs),(int)(y0-rs),(int)(2*rs),(int)(2*rs));
}

if (DTgBtnClicked) {
DTgBtnClicked = false;
double xi = x1-x0;
double yi;
if (y1 == 0) {
yi = Math.sqrt(rb*rb-(xi-d)*(xi-d));
y1 = yi+y0;
}
yi = y1-y0;

g.setColor(Color.red);
g.fillRect((int)x1-1,(int)y1-1,3,3);
double ti = Math.sqrt(xi*xi+yi*yi);
double ui = xi/ti;
double vi = yi/ti;
double bi = Math.sqrt(ti*ti-rs*rs);
double ci = 2*(bi-(rs*vi+ui*bi)*d/ti);

double x2 = xi+((rs*ui-bi*vi)*rs/ti-xi)*ci/bi + x0;
double y2 = yi+((rs*vi+bi*ui)*rs/ti-yi)*ci/bi + y0;

g.setColor(Color.blue);
g.drawLine((int)x1,(int)y1,(int)x2,(int)y2);

x1 = x2; y1 = y2;
}
}

Отговор
в отговор на BadPainter #3

симпатяга, толкова ли е трудно да преместиш if? :)

Friend, RTFM :-)))) Нищо не ти изчезва, просто когато си в paint, ти трябва да преначертаеш всичко.

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class SimplePointCelet
extends Applet {
private static final Color middleGray = new Color(136, 136, 140);
private double rb, rs, d, x0 = 300, y0 = 250, x1 = 0, y1 = 0, x2, y2;
private boolean DCBtnClicked = false;
private boolean DTgBtnClicked = false;
private Button drawTgBtn;
private Button drawCirclesBtn;
private TextField tf_rb;
private TextField tf_rs;
private TextField tf_d;
private TextField tf_spx;

private BtnTgList btnTgList = new BtnTgList();
private BtnCircleList btnCircleList = new BtnCircleList();

public void init() {
drawTgBtn = new Button("Draw next tangent");
drawTgBtn.addActionListener(btnTgList);
drawCirclesBtn = new Button("Draw circles");
drawCirclesBtn.addActionListener(btnCircleList);
tf_rb = new TextField("150");
tf_rs = new TextField("50");
tf_d = new TextField("70");
tf_spx = new TextField("300");
add(new Label("rb ="));
add(tf_rb);
add(new Label("rs ="));
add(tf_rs);
add(new Label("d ="));
add(tf_d);
add(new Label("x ="));
add(tf_spx);
add(drawCirclesBtn);
add(drawTgBtn);
}

class BtnTgList
implements ActionListener {
public void actionPerformed(ActionEvent e) {
DTgBtnClicked = true;
repaint();
}
}

class BtnCircleList
implements ActionListener {
public void actionPerformed(ActionEvent e) {
DCBtnClicked = true;
repaint();
}
}

public void paint(Graphics g) {


if (DCBtnClicked) {
rb = Double.parseDouble(tf_rb.getText());
rs = Double.parseDouble(tf_rs.getText());
d = Double.parseDouble(tf_d.getText());
x1 = Double.parseDouble(tf_spx.getText());
y1 = 0;
}

if (DCBtnClicked)
DCBtnClicked = false;

g.setColor(Color.darkGray);
g.fillOval( (int) (x0 + d - 1), (int) (y0 - 1), 3, 3);
g.drawOval( (int) (x0 + d - rb), (int) (y0 - rb), (int) (2 * rb),
(int) (2 * rb));

g.setColor(middleGray);
g.fillOval( (int) (x0 - 1), (int) (y0 - 1), 3, 3);
g.drawOval( (int) (x0 - rs), (int) (y0 - rs), (int) (2 * rs),
(int) (2 * rs));


if (DTgBtnClicked) {
DTgBtnClicked = false;
double xi = x1 - x0;
double yi;
if (y1 == 0) {
yi = Math.sqrt(rb * rb - (xi - d) * (xi - d));
y1 = yi + y0;
}
yi = y1 - y0;

g.setColor(Color.red);
g.fillRect( (int) x1 - 1, (int) y1 - 1, 3, 3);
double ti = Math.sqrt(xi * xi + yi * yi);
double ui = xi / ti;
double vi = yi / ti;
double bi = Math.sqrt(ti * ti - rs * rs);
double ci = 2 * (bi - (rs * vi + ui * bi) * d / ti);

double x2 = xi + ( (rs * ui - bi * vi) * rs / ti - xi) * ci / bi + x0;
double y2 = yi + ( (rs * vi + bi * ui) * rs / ti - yi) * ci / bi + y0;

g.setColor(Color.blue);
g.drawLine( (int) x1, (int) y1, (int) x2, (int) y2);

x1 = x2;
y1 = y2;
}


}
}

Редактирано от Koнcтaнтин Cпиpoв на

Отговор
в отговор на Koнcтaнтин Cпиpoв #4

uf :(

predi ni6to ne mi iz4ezwa6e, no izob6to niamam spomeni kak si naprawih apleta. be6e ne6to mnogo glupawo i omazano, ama si rabote6e - dokato ne se promeni prozoreca razbira se. prosto iskam pri 4ertaneto na sledwa6ta linia predi6nite da ne iz4ezwat i da prawia repaint na wsi4ko samo pri promiana na prozoreca. wyzmojno e.

Отговор
в отговор на BadPainter #5

Re: uf :(

override-ni update methoda eto taka:
public void update(Graphics g) {
this.paint(g);
}

a ostavi stariq paint kato si e bil...

Отговор
в отговор на lngon #6

update

zna4i ostawiam moia paint() i dobawiam samo override na update()?

Отговор
в отговор на BadPainter #7

Re: update

aha... v update ima edno vikane na g.clearRect() (ili neshto takova beshe) koeto ti trie cqlata vidima oblast na componenta po default... kato go overridnesh tova triene se izbqgva i nqma nujda da prechertavash vsichko ostanalo...

Отговор
в отговор на BadPainter #8

Re: uf :(

Vzemi se nauchi da chetesh pone sobstvenia si kod - ne vizdash li, che programata po-gore ti e opravena i shte raboti - niakoi dobar chovek ti go e opravil :-)

Отговор
в отговор на lngon #9

Re: uf :(

Taka e, no edva li triabva da hvasta update, zashtoto shte si uslozni oshte poveche i bez tova izlishno usloznenata programa - nali niakoi predi tova triabva da mu izchisti starata tangenta? I bez tova vizdam, che izlishno izpolzva dva bulevi flaga i vinagi ediniqt e obratnia na drugia, vmesto da slozi edna not ~ :-)))))

Отговор
в отговор на BadPainter #10

Ей, заплес, не виждаш ли, че съм ти го оправил :-)

%subject%

Отговор
в отговор на BadPainter #11

Blagodaria

... na Konstantin Spirov i Ingon za pomo6tta! Tova s update() proraboti. Sega vsi4kite mi dopiratelni si se vijdat.

Отговор