Yazar |
|
volkan
Giresun
Kayıt: 26.07.2006 |
|
Soru şöyleydi.
Mouse'a basılınca ekrana daire çizilmesi istemiyor.
mouse herhangi bir daire içindeyken F1=red,F2=blue ve F3=gren'ten birine basılınca o dairenin rengi değişiyor.Ayrıca bu tuşlara bastıktan sonra diğer çizeceğimiz dairelerinde renkleri dağişen daire'nin renginde oluyor.
Mouse herhangi bir daire üzerindeyken D veya DELETE tuşuna basılırsa o daire ekrandan siliniyor.
Sağ üst köşedede ekranda bulunan daire sayısının gösterilmesi isteniyor.
Ben her nokta'ya birde o noktanın rengini tutan bi değişken verdim. Ama yinede biyerde birşyler eksik gibi..
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
volkan yazdi | Soru şöyleydi.
Mouse'a basılınca ekrana daire çizilmesi istemiyor.
mouse herhangi bir daire içindeyken F1=red,F2=blue ve F3=gren'ten birine basılınca o dairenin rengi değişiyor.Ayrıca bu tuşlara bastıktan sonra diğer çizeceğimiz dairelerinde renkleri dağişen daire'nin renginde oluyor.
Mouse herhangi bir daire üzerindeyken D veya DELETE tuşuna basılırsa o daire ekrandan siliniyor.
Sağ üst köşedede ekranda bulunan daire sayısının gösterilmesi isteniyor.
Ben her nokta'ya birde o noktanın rengini tutan bi değişken verdim. Ama yinede biyerde birşyler eksik gibi.. |
Biraz önce bu tanımlanan olayları birebir gerçekleştiren bir uygulama yazdım. Şu anda satırlara açıklama ekliyorum kolay anlaşılsın diye. Birazdan kodu buraya ekliycem. Meraklılara duyrulur.
Let`s make this world a better place to live !
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
İşte geldi, buyrun:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
public class Soru extends Applet
implements KeyListener, MouseListener, MouseMotionListener {
Point mouseCoord; // fareyi surekli takip eder
Color brush = Color.black; // firca rengi
ArrayList<Graphics> list = new ArrayList<Graphics>(); // grafik listesi
Label label = new Label("Toplam: 0"); // sekil sayisini gosteren etiket
public void init() {
/* olaylari dinle */
addKeyListener(this);
requestFocus();
addMouseListener(this);
addMouseMotionListener(this);
/* etiketi yerlestir */
this.setLayout(null);
add(label);
/* etiket klavye dinlemeli yoksa klavye hic dinlenmez */
label.addKeyListener(this);
label.requestFocus();
}
public void paint(Graphics g) {
/* Listedeki daireleri ciz */
Rectangle r;
int numOvals = list.size();
for(int i=0; i<numOvals; i++) {
g = list.get(i); // listeden nesneyi cek
/* grafigi ciz */
r = g.getClipBounds();
g.fillOval(r.x, r.y, r.width, r.height);
}
/* Toplam daire sayisini goster */
label.setBounds(getWidth()-80,0, 80, 20);
label.setText("Toplam: "+list.size());
}
/* farenin altında en ondeki direnin ve fircanin rengini degistirir */
public void ChangeBrush(Color c) {
Graphics g;
Shape s;
Rectangle r;
int i, numOvals = list.size(); // eleman sayisini bul
this.brush = c; // firca rengini degistir
/* fare altinda en ondeki daireyi bulur */
for(i=numOvals-1; i>=0; i--) {
g = list.get(i); // listeden nesneyi cek
s = g.getClip(); // nesnenin sekli
if(s.contains(mouseCoord.x, mouseCoord.y)) {
g.setColor(brush); // dairenin rengini degistir
/* sadece gecerli daireyi yeniden ciz */
r = g.getClipBounds();
repaint(r.x, r.y, r.width, r.height);
break;
}
}
}
public void keyPressed(KeyEvent ke) {
int keynum = ke.getKeyCode();
if(keynum == KeyEvent.VK_DELETE || keynum == KeyEvent.VK_D) {
Graphics g;
Shape s;
Rectangle r;
int i, numOvals = list.size(); // eleman sayisini bul
/* fare altinda en ondeki daireyi bulur */
for(i=numOvals-1; i>=0; i--) {
g = list.get(i); // listeden nesneyi cek
s = g.getClip(); // nesnenin sekli
if(s.contains(mouseCoord.x, mouseCoord.y)) {
list.remove(g); // sekli listeden sil
/* silinen yeri tazele */
r = g.getClipBounds();
repaint(r.x, r.y, r.width, r.height);
break;
}
}
}
else if(keynum == KeyEvent.VK_F1)
ChangeBrush(Color.red);
else if(keynum == KeyEvent.VK_F2)
ChangeBrush(Color.blue);
else if(keynum == KeyEvent.VK_F3)
ChangeBrush(Color.green);
}
public void keyReleased(KeyEvent ke) {
}
public void keyTyped(KeyEvent ke) {
}
public void mouseClicked(MouseEvent me) {
}
public void mousePressed(MouseEvent me) {
Graphics g = getGraphics(); // yeni grafik nesnesi
g.setColor(brush); // nesnenin rengini ayarla
/* 20px yaricapli dairenin merkez koordinatlari */
int x = me.getX()-20;
int y = me.getY()-20;
g.setClip(x,y,40,40); // sekli ayarla
list.add(g); // sekli listeye ekle
repaint(x,y,40,40); // olay bolgesini tazele
}
public void mouseReleased(MouseEvent me) {
}
public void mouseExited(MouseEvent me) {
}
public void mouseEntered(MouseEvent me) {
}
public void mouseDragged(MouseEvent me) {
}
public void mouseMoved(MouseEvent me) {
/* fare koordinatlarini izle */
mouseCoord = me.getPoint();
}
}
Let`s make this world a better place to live !
|
|
Yazar |
|
volkan
Giresun
Kayıt: 26.07.2006 |
|
Eline sağlık şafak.. Süper olmuş.. gayet anlaşılır yorumlarda yazmışsın teşekkür ederim
|
|
Yazar |
|
volkan
Giresun
Kayıt: 26.07.2006 |
|
ArrayList<Graphics> list = new ArrayList<Graphics>();
Javada nesne dizileri böylemi tanımlanıyor?
Kendi nesnemin diziside olabilir mi?
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
volkan yazdi | ArrayList<Graphics> list = new ArrayList<Graphics>();
Javada nesne dizileri böylemi tanımlanıyor?
Kendi nesnemin diziside olabilir mi?
|
Bu özel bir sınıf. Normal dizi de yapabilirdim ama bu daha kullanışlı. Aradan eleman sildiğinde o elemandan sonraki elemanların indisleri kendiliğinden eksiliyor. Aynı zamanda boyutu da dinamik olarak değişebiliyor. Bir çeşit özelleşmiş liste diyebiliriz.
Edit: Eklemeyi unutmuşum, bu yapı her türlü nesneyi depolayabilir.
Let`s make this world a better place to live !
|
|
Yazar |
|
reccae
istanbul
banlandı
Kayıt: 15.02.2006 |
|
bide şu özel olmayan yöntemle yapsak şafak
insa ettigim binanin cimentosu kelâm
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
reccae yazdi | bide şu özel olmayan yöntemle yapsak şafak |
Yapmasına yaparsın ama boşuna kasmaya gerek yok, bu çok daha kolay.
Let`s make this world a better place to live !
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
Şimdi farkettim contains metodu Rectangle sınıfında da tanımlıymış. Yani bu durumda alan tespiti için Shape kullanmaya gerek yok. Neyse Shapesiz halini de yazayım, düzenlerken kafa karışıkığı olmasın:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
public class SoruAlt extends Applet
implements KeyListener, MouseListener, MouseMotionListener {
Point mouseCoord; // fareyi surekli takip eder
Color brush = Color.black; // firca rengi
ArrayList<Graphics> list = new ArrayList<Graphics>(); // grafik listesi
Label label = new Label("Toplam: 0"); // sekil sayisini gosteren etiket
public void init() {
/* olaylari dinle */
addKeyListener(this);
requestFocus();
addMouseListener(this);
addMouseMotionListener(this);
/* etiketi yerlestir */
this.setLayout(null);
add(label);
/* etiket klavye dinlemeli yoksa klavye hic dinlenmez */
label.addKeyListener(this);
label.requestFocus();
}
public void paint(Graphics g) {
/* Listedeki daireleri ciz */
Rectangle r;
int numOvals = list.size();
for(int i=0; i<numOvals; i++) {
g = list.get(i); // listeden nesneyi cek
/* grafigi ciz */
r = g.getClipBounds();
g.fillOval(r.x, r.y, r.width, r.height);
}
/* Toplam daire sayisini goster */
label.setBounds(getWidth()-80,0, 80, 20);
label.setText("Toplam: "+list.size());
}
/* farenin altında en ondeki direnin ve fircanin rengini degistirir */
public void ChangeBrush(Color c) {
Graphics g;
Rectangle r;
int i, numOvals = list.size(); // eleman sayisini bul
this.brush = c; // firca rengini degistir
/* fare altinda en ondeki daireyi bulur */
for(i=numOvals-1; i>=0; i--) {
g = list.get(i); // listeden nesneyi cek
r = g.getClipBounds();
if(r.contains(mouseCoord.x, mouseCoord.y)) {
g.setColor(brush); // dairenin rengini degistir
/* sadece gecerli daireyi yeniden ciz */
repaint(r.x, r.y, r.width, r.height);
break;
}
}
}
public void keyPressed(KeyEvent ke) {
int keynum = ke.getKeyCode();
if(keynum == KeyEvent.VK_DELETE || keynum == KeyEvent.VK_D) {
Graphics g;
Rectangle r;
int i, numOvals = list.size(); // eleman sayisini bul
/* fare altinda en ondeki daireyi bulur */
for(i=numOvals-1; i>=0; i--) {
g = list.get(i); // listeden nesneyi cek
r = g.getClipBounds();
if(r.contains(mouseCoord.x, mouseCoord.y)) {
list.remove(g); // sekli listeden sil
/* silinen yeri tazele */
repaint(r.x, r.y, r.width, r.height);
break;
}
}
}
else if(keynum == KeyEvent.VK_F1)
ChangeBrush(Color.red);
else if(keynum == KeyEvent.VK_F2)
ChangeBrush(Color.blue);
else if(keynum == KeyEvent.VK_F3)
ChangeBrush(Color.green);
}
public void keyReleased(KeyEvent ke) {
}
public void keyTyped(KeyEvent ke) {
}
public void mouseClicked(MouseEvent me) {
}
public void mousePressed(MouseEvent me) {
Graphics g = getGraphics(); // yeni grafik nesnesi
g.setColor(brush); // nesnenin rengini ayarla
/* 20px yaricapli dairenin merkez koordinatlari */
int x = me.getX()-20;
int y = me.getY()-20;
g.setClip(x,y,40,40); // sekli ayarla
list.add(g); // sekli listeye ekle
repaint(x,y,40,40); // olay bolgesini tazele
}
public void mouseReleased(MouseEvent me) {
}
public void mouseExited(MouseEvent me) {
}
public void mouseEntered(MouseEvent me) {
}
public void mouseDragged(MouseEvent me) {
}
public void mouseMoved(MouseEvent me) {
/* fare koordinatlarini izle */
mouseCoord = me.getPoint();
}
}
Ama yine de daireyi kapsayan en küçük kareye göre yapılıyor farenin altında kalan daire üzerindeki işlemler. Yani köşelerdeki boşluklar da olaya karışıyor. Aslında bunun mükkemmel olması için biraz geometri çalıştırabiliriz. Farenin bulunduğu koordinat ile dairein merkezi arasındaki mesafe dairenin yarıçapına eşit ya da küçük ise işlemi yap gibisinden. Tabii bu tarama yine en son eklenen daireden başlayarak yapılacak. Var mı böyle bir karşılaştırma fonksiyonu yazabilecek gönüllü?
Aslında basit gibi duruyor, uyumazsam birazdan yazarım belki.
Var mı ben gibi canı sıkıldıkça program yazan.
Bu arada Sun'ın sitesindeki klavuz çok hoşuma gitti:
http://java.sun.com/j2se/1.4.2/docs/api/index.html
Let`s make this world a better place to live !
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
İşte o kontrolü yapacak olan fonksiyon da hazır:
boolean isPointOnCircle(Graphics oval, Point p) {
Rectangle r = oval.getClipBounds();
double cap = (r.width)/2;
double centerX = (r.x) + cap;
double centerY = (r.y) + cap;
double distance = Math.sqrt(Math.pow((centerX - p.x),2) + Math.pow((centerY - p.y),2));
if(distance <= cap)
return true;
else
return false;
}
Şimdi de fonksiyonu koda entegre edelim:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
public class SoruAlt extends Applet
implements KeyListener, MouseListener, MouseMotionListener {
Point mouseCoord; // fareyi surekli takip eder
Color brush = Color.black; // firca rengi
ArrayList<Graphics> list = new ArrayList<Graphics>(); // grafik listesi
Label label = new Label("Toplam: 0"); // sekil sayisini gosteren etiket
public void init() {
/* olaylari dinle */
addKeyListener(this);
requestFocus();
addMouseListener(this);
addMouseMotionListener(this);
/* etiketi yerlestir */
this.setLayout(null);
add(label);
/* etiket klavye dinlemeli yoksa klavye hic dinlenmez */
label.addKeyListener(this);
label.requestFocus();
}
public void paint(Graphics g) {
/* Listedeki daireleri ciz */
Rectangle r;
int numOvals = list.size();
for(int i=0; i<numOvals; i++) {
g = list.get(i); // listeden nesneyi cek
/* grafigi ciz */
r = g.getClipBounds();
g.fillOval(r.x, r.y, r.width, r.height);
}
/* Toplam daire sayisini goster */
label.setBounds(getWidth()-80,0, 80, 20);
label.setText("Toplam: "+list.size());
}
/* farenin altında en ondeki direnin ve fircanin rengini degistirir */
public void ChangeBrush(Color c) {
Graphics g;
Rectangle r;
int i, numOvals = list.size(); // eleman sayisini bul
this.brush = c; // firca rengini degistir
/* fare altinda en ondeki daireyi bulur */
for(i=numOvals-1; i>=0; i--) {
g = list.get(i); // listeden nesneyi cek
r = g.getClipBounds();
if(isPointOnCircle(g, new Point(mouseCoord.x, mouseCoord.y))) {
g.setColor(brush); // dairenin rengini degistir
/* sadece gecerli daireyi yeniden ciz */
repaint(r.x, r.y, r.width, r.height);
break;
}
}
}
private boolean isPointOnCircle(Graphics oval, Point p) {
Rectangle r = oval.getClipBounds();
double cap = (r.width)/2;
double centerX = (r.x) + cap;
double centerY = (r.y) + cap;
double distance = Math.sqrt(Math.pow((centerX - p.x),2) + Math.pow((centerY - p.y),2));
if(distance <= cap)
return true;
else
return false;
}
public void keyPressed(KeyEvent ke) {
int keynum = ke.getKeyCode();
if(keynum == KeyEvent.VK_DELETE || keynum == KeyEvent.VK_D) {
Graphics g;
Rectangle r;
int i, numOvals = list.size(); // eleman sayisini bul
/* fare altinda en ondeki daireyi bulur */
for(i=numOvals-1; i>=0; i--) {
g = list.get(i); // listeden nesneyi cek
r = g.getClipBounds();
if(isPointOnCircle(g, new Point(mouseCoord.x, mouseCoord.y))) {
list.remove(g); // sekli listeden sil
/* silinen yeri tazele */
repaint(r.x, r.y, r.width, r.height);
break;
}
}
}
else if(keynum == KeyEvent.VK_F1)
ChangeBrush(Color.red);
else if(keynum == KeyEvent.VK_F2)
ChangeBrush(Color.blue);
else if(keynum == KeyEvent.VK_F3)
ChangeBrush(Color.green);
}
public void keyReleased(KeyEvent ke) {
}
public void keyTyped(KeyEvent ke) {
}
public void mouseClicked(MouseEvent me) {
}
public void mousePressed(MouseEvent me) {
Graphics g = getGraphics(); // yeni grafik nesnesi
g.setColor(brush); // nesnenin rengini ayarla
/* 20px yaricapli dairenin merkez koordinatlari */
int x = me.getX()-20;
int y = me.getY()-20;
g.setClip(x,y,40,40); // sekli ayarla
list.add(g); // sekli listeye ekle
repaint(x,y,40,40); // olay bolgesini tazele
}
public void mouseReleased(MouseEvent me) {
}
public void mouseExited(MouseEvent me) {
}
public void mouseEntered(MouseEvent me) {
}
public void mouseDragged(MouseEvent me) {
}
public void mouseMoved(MouseEvent me) {
/* fare koordinatlarini izle */
mouseCoord = me.getPoint();
}
}
İşte bu kadar... Daha mükkemmel hale getirebilmek için başka fikri olan varsa paylaşssın.
İyi geceler...
Let`s make this world a better place to live !
|
|
Yazar |
|
volkan
Giresun
Kayıt: 26.07.2006 |
|
repaint(x,y,40,40); yerine
paint(g); koydum yine çalıştı. Benim bilmediğim. Şafak requestFocus() ne işe yarıyor? Kullanmazsak ne olur? Neden ihtiyaç duymuşlarki bu koda? Daha önce hiç kullanmadım. İnternettede güzel bir açıklama yok.
Kodun bu haliyle zaten mükemmel, daha iyisine luzum yok.
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
repaint(x,y,40,40); yerine
paint(g);
oluyor fakat silme işleminde istenilen sonucu vermiyor. Çünkü silme işlemi sadece geçerli nesnenin listeden çıkarılması üzerine kurulu. Yani o nesneyi yok edebilecek bir yöntem bulamadım java'da. Zaten yok etsek bu sefer de paint() boş referans alacağından istenilen sonucu vermez. Ama diğer metodlarda paint(g) daha güzel ve temiz.
requestFocus() ile program klavye odağı talep ediyor. Ayrıntıları bilmiyorum ama bu metodu çağırmadan program klavye olaylarını algılamıyor.
Let`s make this world a better place to live !
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | | | | | |