PDA

View Full Version : کامپوننت یک لینک در اپلت



emad4000
دوشنبه 31 اردیبهشت 1386, 13:45 عصر
سلام من می خوام یه کلاس برای لینک در اپلت طراحی کنم
یه کلاس تعریف کردم که از JComponent ارث می بره و متدهای مربوط به نمایش این لینک در مکان دلخواه از اپلت رو نوشتم
حالا می خوام کلیک روی این لینک تشخیص داده بشه . یه InnerClass از نوع MouseListener نوشتم که توی این کلاس به ازای کلیک مختصات کلیک شده رو می گیره و عملیات مربوطه رو انجام میده. ولی موقع اجرا هر جای صفحه هم که کلیک بکنم اصلا سراغ این رویداد نمی ره
شما نمی دونین مشکل چیه ؟ آیا اصلا در اپلت ها میشه از MouseListener و JComponent یا Component استفاده کرد ؟؟؟



Class MyLink extends JComponent
{
public MyLink(String text,int x,int y)
{
...
Class myListener implements MouseListener
{
public void MouseClicked(MouseEvent e)
{
...
}
...
}
this.addMouseListener(new myListener());
}

public void paint(Graphics g)
{
g.drawString(text,x,y);
}
}

pooyanm
سه شنبه 01 خرداد 1386, 02:27 صبح
component با این رویداد مشکلی نداره. متدهای getSize یا getPreferredSize به درستی پیاده شدن؟ همه متن نمایش داده می شه؟

emad4000
پنج شنبه 03 خرداد 1386, 12:57 عصر
بله متن به درستی نمایش داده میشه
این دوتا متدی که میگین برای چی باید پیاده سازی بشن ؟ اگه منظورتون تشخیص موقعیت کلیک شده در متد actionPerformed ه که باید بگم اون مشکل نداره . مسئله اینجاست که اصلا وارد این متد نمیشه که بخواد موقعیت کلیک رو چک کنه . من خط به خط اجراش کردم اصلا وارد این متد نمیشه .

pooyanm
جمعه 04 خرداد 1386, 02:13 صبح
بله متن به درستی نمایش داده میشه
این دوتا متدی که میگین برای چی باید پیاده سازی بشن ؟ اگه منظورتون تشخیص موقعیت کلیک شده در متد actionPerformed ه که باید بگم اون مشکل نداره . مسئله اینجاست که اصلا وارد این متد نمیشه که بخواد موقعیت کلیک رو چک کنه . من خط به خط اجراش کردم اصلا وارد این متد نمیشه .
سلام

شما نیاز داری که حداقل یکی از این دو متد وترجیحا getPreferredSize را پیاده سازی کنی برای این که component دربرگیرنده یا اپلت بدونه که این component شما چه اندازه ای داره و بر پایه این اندازه چه بخشها و مختصاتی از کلیک ماوس و دیگر رویدادها به این component مربوط می شن. به عبارت دیگه در حالت فعلی اندازه این جزء تقریبا صفره یعنی هیچگاه رویداد ماوس روی شیئی که جایی را اشغال نکرده دریافت نخواهد شد. دلیل نمایش اون متن هم اینه که در واقع بر روی شئ Graphics که از اجزای بالادست دریافت شده نمایش پیدا می کنه.
اینها تنها یکی دو مورد از ریزه کاریهای پیاده سازی یک JComponent هستند پس اگر مشکل با این کار حل نشد بهتره کد کامل تری بذارین.

emad4000
پنج شنبه 17 خرداد 1386, 14:05 عصر
شرمنده ولی مشکل من هنوز حل نشده . اینم از سورس کدم . لطفا ببینین مشکل چیه ؟



public class LinkClass extends JComponent
{
private int x;
private int y;
private String text;

public LinkClass(String _text,int _x,int _y)
{
this.text=_text;
this.x=_x;
this.y=_y;
this.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
mouseClick(e);
}
});
}

public void showLink(Graphics board)
{
board.drawString(text,x,y);
}

private void mouseClick(MouseEvent e)
{
text = "Emad Clicked";
repaint();
}

public Dimension getPreferredSize()
{
return new Dimension(100,30);
}

public Dimension getSize()
{
return new Dimension(100,30);
}
}



public class MainApplet extends Applet
{
LinkClass link;

public void paint(Graphics g)
{
link = new LinkClass("Emad",120,20);
link.showLink(g);
}
}

pooyanm
پنج شنبه 17 خرداد 1386, 19:10 عصر
سلام
مشکل اینه که اصلا این component به اپلت اضافه نشده برای همین این رویداد تنها روی اپلت کار می کنه و در واقع این شیء لینک به هیچ شکلی شناسایی نخواهد شد من این کد رو کمی تغییر دادم و آزمایش کردم حالا درست کار می کنه:


import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.awt.Dimension;
import java.util.Date;
import javax.swing.JLabel;
import javax.swing.*;
class LinkClass extends JComponent {
private int x;
private int y;
private String text;
public LinkClass(String _text,int _x,int _y)
{
this.text=_text;
this.x=_x;
this.y=_y;
this.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
mouseClick(e);
}
});
}
public void paint(Graphics g) {
showLink(g);
}
public void showLink(Graphics board)
{
board.drawString(text,x,y);
}
private void mouseClick(MouseEvent e)
{
text = "Emad Clicked";
repaint();
}
public Dimension getPreferredSize()
{
return new Dimension(100,30);
}
public Dimension getSize()
{
return new Dimension(100,30);
}
}
public class MainApplet extends Applet {
LinkClass link;
public MainApplet() {
add(new LinkClass("Emad",20,20));
}
}