ایجاد یک JPanel سفارشی برای ترسیم خطوط
سلام دوستان
من یک کلاس که 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);
}
}
نقل قول: ایجاد یک JPanel سفارشی برای ترسیم خطوط
سلام.
نکته اینه که باید اینجا از متد 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));
}
}