yegane8
دوشنبه 30 مرداد 1391, 05:34 صبح
سلام
می خواستم بدونم وقتی از یک interface مثلا ActionListener استفاده می کنیم متدهایی که حالا باید implement شون کنیم تو برنامه کی اجرا میشن؟
چون من یه کلاس دیدم بدون اینکه تو constructor متدی رو صدا کنه فقط تو متد actionPerformed یکی از متد ها ی اوون کلاس رو صدا زده بود و برنامه هم به درستی اجرا میشد
و البته سوالم در مورد کلاس هایی که از یک کلاس به ارث می برند و یکی از متد های کلاس پدر رو override میکنن هم هست
باتشکر
spiderman200700
دوشنبه 30 مرداد 1391, 22:04 عصر
سلام
وقتی میخوایم از یه interface شی بسازیم،مجبوریم تمام متد هاشو implement کنیم.
قبل از پیاده سازی interface ، اون یه interface با چند تا متد بدون بدنه هست، ولی بعد از پیاده سازی و ساخت شی ، اون دیگه تبدیل به یه Object با متد های دارای بدنه شده. یعنی به هر جا بخوایم ازش استفاده کنیم دیگه مشکلی نیست، چون دیگه متدهای این Object دارای بدنه هست و پیاده سازی شده.
مثال خیلی واضح این کار همین ActionListener هست که ما موقع اضافه کردن یه ActionListener به یه کامپوننت، اول متد های اونو پیاده سازی میکنیم و یه شی ازش میسازیم، بعد به کلاس addActionListener پاسش میدیم.
امیدوارم واضح گفته باشم.
yegane8
سه شنبه 31 مرداد 1391, 04:49 صبح
ممنون
اما منظورم این نبود منظورماینه که وقتی یک interface رو پیاده سازی می کنیم متد هایی که پیاده سازی کردیم نسبت به چه الویتی در برنامه اجرا میشن
الان این برنامه رو ببنید :
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Bubbles extends JPanel implements ActionListener {
private static Color colors[] = {
Color.blue, Color.cyan, Color.green,
Color.magenta, Color.orange, Color.pink,
Color.red, Color.yellow, Color.lightGray, Color.white
};
private Ellipse2D.Float[] ellipses;
private double esize[];
private float estroke[];
private double maxSize = 0;
private boolean initialize = true;
Timer timer;
ActionListener updateProBar;
public Bubbles() {
setBackground(Color.black);
ellipses = new Ellipse2D.Float[25];
esize = new double[ellipses.length];
estroke = new float[ellipses.length];
for (int i = 0; i < ellipses.length; i++) {
ellipses[i] = new Ellipse2D.Float();
getRandomXY(i, 20 * Math.random(), 200, 200);
}
timer = new Timer(20, this);
timer.setInitialDelay(190);
timer.start();
}
public void getRandomXY(int i, double size, int w, int h) {
esize[i] = size;
estroke[i] = 1.0f;
double x = Math.random() * (w - (maxSize / 2));
double y = Math.random() * (h - (maxSize / 2));
ellipses[i].setFrame(x, y, size, size);
}
public void reset(int w, int h) {
maxSize = w / 10;
for (int i = 0; i < ellipses.length; i++) {
getRandomXY(i, maxSize * Math.random(), w, h);
}
}
public void step(int w, int h) {
for (int i = 0; i < ellipses.length; i++) {
estroke[i] += 0.025f;
esize[i]++;
if (esize[i] > maxSize) {
getRandomXY(i, 1, w, h);
} else {
ellipses[i].setFrame(ellipses[i].getX(), ellipses[i].getY(),
esize[i], esize[i]);
}
}
}
public void render(int w, int h, Graphics2D g2) {
for (int i = 0; i < ellipses.length; i++) {
g2.setColor(colors[i % colors.length]);
g2.setStroke(new BasicStroke(estroke[i]));
g2.draw(ellipses[i]);
}
}
public void paint(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
RenderingHints rh =
new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHints(rh);
Dimension size = getSize();
if (initialize) {
reset(size.width, size.height);
initialize = false;
}
this.step(size.width, size.height);
render(size.width, size.height, g2);
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] args) {
JFrame frame = new JFrame("Bubbles");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.add(new Bubbles());
frame.setSize(350, 250);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
متد actionPerformed کجا فراخوانی شده ؟ کی تو برنامه این متد صدا میشه ؟
spiderman200700
سه شنبه 31 مرداد 1391, 19:06 عصر
کانسترکتور کلاس Timer یه زمان برای وقفه و یه ActionListener میگیره.
و بعد از start کردنش، هردفعه بعد از زمان وقفه ای که خودت تعین کردی، متد actionPerformed شی ActionListenerی که بهش دادی رو فراخوانی میکنه.
در اینجا چون کلاس رابط ActionListener رو پیاده سازی کرده، خودش ActionListener محسوب میشه. به خاطر همین this رو به کلاس Timer داده.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.