PDA

View Full Version : سوال: ایجاد یک JPanel سفارشی برای ترسیم خطوط



pooya1072
جمعه 22 آبان 1394, 14:52 عصر
سلام دوستان
من یک کلاس که JPanel رو extends و KeyListener رو implements میکنه ساختم . حالا می خوام که به محض اجرای برنامه (در تابع main) در پانل , دو خط ( توسط DrawLine) ترسیم بشه . مشکل من اینه که تا الان هر کاری کردم دستور اعمال نمیشه . فقط در یک صورت ترسیم انجام شده , اونم به این صورت که در رویداد KeyTyped دستور DrawَAxis رو قرار بدم . ولی نمیتونم از داخل تابع main ترسیم رو انجام بدم . هر دو کلاس رو قرار میدم تا یه نگاهی بهش بندازید . (به تابع DrawAxis دقت کنید,خط 47 از کلاس Drawing و خط 11 از کلاس main ) . قصد من اینه که ترسیم خطوط رو از بیرون کلاس Drawing کنترل کنم . مثلا از داخل کلاس main . ولی در حال حاضر فقط از داخل کلاس Drawing می تونم خط رسم کنم ,ولی از بیرون کلاس Drawing خطی ترسیم نمیشه .
ممنون

کلاس Drawing





import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Drawing extends JPanel implements KeyListener
{
private int width;
private int height;

public Drawing()
{
addKeyListener(this);
}

private void DrawLine(Point SP,Point EP){
Graphics g=getGraphics();
g.drawLine(SP.x, SP.y, EP.x, EP.y);
g.dispose();
}

public void DrawAxis(){
System.out.print("Axis is drawn ....");
width=this.getWidth();
height=this.getHeight();
DrawLine(new Point(0,height/2),new Point(width,height/2));
DrawLine(new Point(width/2,0),new Point(width/2,height));
}

@Override
public void keyPressed(KeyEvent event) {
// TODO Auto-generated method stub

}

@Override
public void keyReleased(KeyEvent event) {
// TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent event) {
//char c=event.getKeyChar();
DrawAxis();
}

}




اینم کلاس main :


import javax.swing.JFrame;

public class Example1
{
public static void main(String[] args) {
JFrame jf=new JFrame();
jf.setSize(500, 500);
Drawing d=new Drawing();
d.setFocusable(true);
//***********************************
d.DrawAxis();
//***********************************
jf.add(d);
jf.setVisible(true);
}
}

ahmad.mo74
شنبه 23 آبان 1394, 22:36 عصر
سلام.

نکته اینه که باید اینجا از متد paintComponent استفاده کنید.
این متد هر وقت که قرار باشه تغییری توی کامپوننت بوجود بیاد و نیاز هست که آپدیت بشه (از جمله زمان ساخته شدنش)، صدا زده میشه.
حالا اگر میخواید که تعییر دلخواهی توی ظاهر کامپوننتتون ایجاد کنید باید این متدو override کنید.

پس کد این شکلی میشه :


import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


@SuppressWarnings("serial")
public class Drawing extends JPanel implements KeyListener {


private int width;
private int height;


public Drawing() {
addKeyListener(this);
}


@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
DrawAxis(g);
g.dispose();
}


public void DrawAxis(Graphics g) {
System.out.print("Axis is drawn ....");
width = this.getWidth();
height = this.getHeight();
DrawLine(g, new Point(0, height / 2), new Point(width, height / 2));
DrawLine(g, new Point(width / 2, 0), new Point(width / 2, height));
}


private void DrawLine(Graphics g, Point SP, Point EP) {
g.drawLine(SP.x, SP.y, EP.x, EP.y);
}


@Override
public void keyPressed(KeyEvent event) {
// TODO Auto-generated method stub
}


@Override
public void keyReleased(KeyEvent event) {
// TODO Auto-generated method stub
}


@Override
public void keyTyped(KeyEvent event) {
// char c=event.getKeyChar();
// DrawAxis();
}


public static void main(String[] args) {
JFrame frame = new JFrame();


frame.setPreferredSize(new Dimension(500, 500));
frame.setDefaultCloseOperation(WindowConstants.EXI T_ON_CLOSE);


frame.add(new Drawing());
frame.pack();


frame.setLocationRelativeTo(null);
EventQueue.invokeLater(() -> frame.setVisible(true));
}


}