PDA

View Full Version : چگونه از drawLine توي يك تابع يا كلاس جديد استفاده كنم؟



pouria_bayat
جمعه 03 دی 1389, 11:01 صبح
سلام لطفا جواب بديد.
سوال من اينه چطور ميشه كه داخل يك دكمه در حالت actionperformed ميشه يك خط رو رسم كرد ولي با صدا زدن يك تابع يا كلاس ديگه اين امكان وجود نداره؟ به عنوان مثال :

وقتي كه با استفاده از دكمه از دستور drawline استفاده مي كنم خط مربوطه رسم ميشه و در ست عمل ميكنه:

import javax.swing.*;
import java.awt.*;
import java.io.*;





public class Sot extends javax.swing.JFrame{
Graphics source;




public Sot() {
initComponents();
ShowPic(1);
this.setTitle("Sot");
this.setLocation(100,100);


}




private void JBActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
source = JLPic.getGraphics();
source.setColor(Color.BLUE);
source.drawLine(10, 10, 200, 300);

}



public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {


public void run() {
new Sot().setVisible(true);

}
});
}


public void ShowPic(int i){
if(i==1){
java.net.URL iconurl = getClass().getResource("Images"+File.separator
+"123.png");
ImageIcon Pic = new ImageIcon(iconurl);
JLPic.setIcon(Pic);

}
}



// Variables declaration - do not modify
private javax.swing.JButton JB;
public javax.swing.JLabel JLPic;
private javax.swing.JPanel jPanel1;
}
ولي وقتي كه همون دستورات رو توي يك تابع استفاده ميكنم خطي رسم نميشه و كار خاصي انجام نميده:

import javax.swing.*;
import java.awt.*;
import java.io.*;





public class Sot extends javax.swing.JFrame{
Graphics source;




public Sot() {
initComponents();
ShowPic(1);
ShowLine(1,2); ======>it's not correct and Do not nothing!!!!!!!!
this.setTitle("Sot");
this.setLocation(100,100);


}







public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {


public void run() {
new Sot().setVisible(true);

}
});
}


public void ShowPic(int i){
if(i==1){
java.net.URL iconurl = getClass().getResource("Images"+File.separator
+"123.png");
ImageIcon Pic = new ImageIcon(iconurl);
JLPic.setIcon(Pic);

}
}

public void ShowLine(int i,int j){
if (i==1){
source = JLPic.getGraphics();
source.setColor(Color.BLUE);
source.drawLine(10, 10, 200, 300);
}
}



// Variables declaration - do not modify
private javax.swing.JButton JB;
public javax.swing.JLabel JLPic;
private javax.swing.JPanel jPanel1;
}

لطفا راهنمايي كنيد چطور مي تونم با صدا زدن تابع يا يك كلاس ديگه اين امكان رو داشته باشم كه خط مربوطه رو رسم كنم!!!

persianshadow
جمعه 03 دی 1389, 16:30 عصر
خب دلیلش این هست که در مورد دوم هنوز Jlabel ترسیم نشده و مقداری برای Graphics وجود نداره و null هست شما فراخوانی متدی که
خط رو رسم میکنه رو در سازنده گذاشتید اگه فراخوانی رو از اونجا بردارید تا JFrame ترسیم بشه مقدار برای Graphics به وجود میاد و شما
میتونید خط خودتون رو ترسیم کنید.

pouria_bayat
جمعه 03 دی 1389, 20:13 عصر
خب دلیلش این هست که در مورد دوم هنوز Jlabel ترسیم نشده و مقداری برای Graphics وجود نداره و null هست شما فراخوانی متدی که
خط رو رسم میکنه رو در سازنده گذاشتید اگه فراخوانی رو از اونجا بردارید تا JFrame ترسیم بشه مقدار برای Graphics به وجود میاد و شما
میتونید خط خودتون رو ترسیم کنید.

ممنون از جوابتون كاش همه مثل شما بودند.
حقيقتش اينه كه من ميخواستم توي يك Jpanel يك تصوير پياده سازي كنم و توي تصوير مروبطه چند ناحيه حساس ايجاد كنم كه قابل نوشتن باشه از طريق برنامه مثل چند jLabel اما متوجه شدم كه كل راه حل بالا اشتباه هستش چرا كه عكس توي jLabel لود ميشه و ديگه نميشه توي jLabel مربوطه و روي عكس چندتا jlabel‌ديگه بزارم حالا يك سوال داشتم ميدونم وقتتونو ميگره ولي خدايي همه جا سرچ كردم و كلا گيج شدم چطور مي تونم حالا توي jpanel يك تصوير بزارم و روي تصوير چندتا jlabel باشه ؟!!! البته اين كار رو ميخواهم توسط يك كلاس جدا گانه انجام بشه كه توي سازنده نباشه.
لطفا كمكم كنيد.
ممنونم.

pouria_bayat
جمعه 03 دی 1389, 21:28 عصر
ببينيد براي اينكه بهتر توضيح داده باشم با سرچ توي اينترنت يك كلاس جديد ايجاد كردم به شكل زير:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ImagePanel extends JPanel{

private BufferedImage image;

public void ImagePanel() {
try {
java.net.URL iconurl = getClass().getResource("Images"+File.separator
+"123.png");
image = ImageIO.read(iconurl);
} catch (IOException ex) {
// handle exception...
JOptionPane.showMessageDialog(null, "Image Not Exist!!!");
}
}


@Override
public void paintComponent (Graphics g) {
g.drawImage(image, 0, 0, null);

}



}

بعد توي jFrame اصلي برنامه اومدم يك شي از اون كلاس تعريف كردم و به jpanel كه (JPPic) هستش شي مربوطه رو add كردم مثل زير:

ImagePanel sr = new ImagePanel();
this.JPPic.add(sr);

اما تصوير قرار نميگيره ايراد كار من كجاست؟
لطفا با كد واضح راهنمايي كنيد.
باز ممنونم.

javaphantom
جمعه 03 دی 1389, 23:18 عصر
ممنون از جوابتون كاش همه مثل شما بودند.
حقيقتش اينه كه من ميخواستم توي يك Jpanel يك تصوير پياده سازي كنم و توي تصوير مروبطه چند ناحيه حساس ايجاد كنم كه قابل نوشتن باشه از طريق برنامه مثل چند jLabel اما متوجه شدم كه كل راه حل بالا اشتباه هستش چرا كه عكس توي jLabel لود ميشه و ديگه نميشه توي jLabel مربوطه و روي عكس چندتا jlabel‌ديگه بزارم حالا يك سوال داشتم ميدونم وقتتونو ميگره ولي خدايي همه جا سرچ كردم و كلا گيج شدم چطور مي تونم حالا توي jpanel يك تصوير بزارم و روي تصوير چندتا jlabel باشه ؟!!! البته اين كار رو ميخواهم توسط يك كلاس جدا گانه انجام بشه كه توي سازنده نباشه.
لطفا كمكم كنيد.
ممنونم.



public class MyFrame extends JFrame {

private JTextField t1;
private JTextField t2;
private JPanel p;
private boolean flag = true;


public MyFrame() {
this.setBounds(new Rectangle(200, 200));
this.getContentPane().add(this.getP());

this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}

public JPanel getP() {
if (p == null) {
p = new JPanel() {
Image image = Toolkit.getDefaultToolkit().createImage("/home/zack/Downloads/IMG_2704.JPG");

@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
}
};
p.setLayout(new FlowLayout());
p.add(this.getT1());
p.add(this.getT2());
}
return p;
}

public JTextField getT1() {
if (t1 == null) {
t1 = new JTextField();
t1.setColumns(20);
}
return t1;
}

public JTextField getT2() {
if (t2 == null) {
t2 = new JTextField();
t2.setColumns(20);
}
return t2;
}


public static void main(String[] s) {
new MyFrame();
}

}


من حوصله لینک گذاشتن برات ندارم ولی اگر سرچ می کردی می تونستی خودتم به جواب برسی.

pouria_bayat
شنبه 04 دی 1389, 01:10 صبح
public class MyFrame extends JFrame {

private JTextField t1;
private JTextField t2;
private JPanel p;
private boolean flag = true;


public MyFrame() {
this.setBounds(new Rectangle(200, 200));
this.getContentPane().add(this.getP());

this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}

public JPanel getP() {
if (p == null) {
p = new JPanel() {
Image image = Toolkit.getDefaultToolkit().createImage("/home/zack/Downloads/IMG_2704.JPG");

@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
}
};
p.setLayout(new FlowLayout());
p.add(this.getT1());
p.add(this.getT2());
}
return p;
}

public JTextField getT1() {
if (t1 == null) {
t1 = new JTextField();
t1.setColumns(20);
}
return t1;
}

public JTextField getT2() {
if (t2 == null) {
t2 = new JTextField();
t2.setColumns(20);
}
return t2;
}


public static void main(String[] s) {
new MyFrame();
}

}
من حوصله لینک گذاشتن برات ندارم ولی اگر سرچ می کردی می تونستی خودتم به جواب برسی.
ممنون از لطف شما اما باز تصوير مربوطه لود نشد و نمايش داده نشد.
من از netbeans استفاده مي كنم شما هم سورس مربوطه را اجرا كنيد خودتون.
من بعد از اجرا با تصوير فريم زير روبرو شدم(البته سورس كد قبل رو من قبلا اجرا كرده بودم چون به نتيجه نرسيدم مزاحم شما شدم):
64063

ممنون ميشم از راهنمايهاتون استفاده كنم تا اين پرو‍ژه رو تكميل كنم.

persianshadow
شنبه 04 دی 1389, 06:06 صبح
این کد درست هست و عکس هم روی پنل ترسیم میشه شما فقط باید در خط زیر آدرس مربوط به تصویر خودتون رو بدید :

[code]
Image image = Toolkit.getDefaultToolkit().createImage("/home/zack/Downloads/IMG_2704.JPG");
[code/]

شما فعلا یه آدرس ثابت به این خط بدید مثلا :

[code]

c://picture.jpg

[code/]

pouria_bayat
شنبه 04 دی 1389, 08:19 صبح
ممنونم نميدونم چطوري ازتون تشكر كنم اميدوارم توي مطالب و يادگيري به هرچي ميخواهيد برسيد و توي برنامه نويسي هيچ موقع گير نكنيد.
اشكال از ادرس دهي بنده هستش فقط موندم اينكه چطوري فايل عكس رو توي خود پروژه بزارم طوري كه ادرس رو بتونه بخونه.
باز ممنون.لطف كرديد.

javaphantom
شنبه 04 دی 1389, 09:05 صبح
URL url = getClass().getResource("resources/Winter.jpg");
File f = new File(url.getFile());
System.out.println("f.length() = " + f.length());


توی فلدر source برنامت یک فلدر به نام resource درست کن فایل عکست و بنداز اونو و با url ی نوشتم صداش کن

pouria_bayat
شنبه 04 دی 1389, 19:28 عصر
باز ممنون يك سوال ديگه هم داشتم و اين سوال اخره من توي اين زمينه چيزي كه هستش اينه كه من اومدم كد فوق رو كمي تغيير دادم يعني يك jTabbedPane به فرم اصلي برنامه اضافه كردم سپس با استفاده از دستور :

this.jTabbedPane1.add("Res",this.getP());عكس و panel رو به jTabbedPane اضافه كردم در قالب برگه (Res) اما چيزي كه هست اينه كه عكس و Panel كه توي كد:


public JPanel getP(){
if (Jppic == null) {
Jppic = new JPanel() {
Image image = Toolkit.getDefaultToolkit().createImage("C://f1.png");
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0,250,250 , Jppic);
}
};
Jppic.setBorder(BorderFactory.createTitledBorder("Pic"));

}
return Jppic;
}
تعريف ميشه كل برگه Res منرو ميگيرحالا ميخواهم دو panel جديد به همون برگه Res اضافه كنم به طوري كه يكي از Panel‌ هاي جديد در سمت بالا و ديگري در سمت چپ و پنل قديمي كه عكس توش بود در سمت راست نمايش بده، ولي متاسفانه با مدير صفحه بندي با مشگل برخوردم به طوري كه با مديرهاي زير نمي تونم اينكارو بكنم:

FlowLayout layout1 =new FlowLayout(FlowLayout.RIGHT);
p.setLayout(Border);
با مشگل موجه ميشم. اخه من معمولا با netbeans اينكارو ميكردم الان كاملا مطمئن شدم اشتباه بوده كارم و بايد به طوري دستي كد نويسي ميكردم.

ميخواهم كارم تقريبا به شكل زير باشه:
64107

شرمنده باز.

javaphantom
شنبه 04 دی 1389, 20:12 عصر
public class MyFrame extends JFrame {

private JPanel masterPanel;
private JPanel leftPanel;
private JPanel rightPanel;
private JTabbedPane myTab;



public MyFrame() {
this.setBounds(new Rectangle(200, 200));
this.getContentPane().add(this.getMyTab());
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}


public JTabbedPane getMyTab() {
if (this.myTab == null) {
this.myTab = new JTabbedPane();
this.myTab.addTab("res",this.getMasterPanel());
}
return myTab;
}

public JPanel getMasterPanel() {
if (this.masterPanel == null) {
this.masterPanel = new JPanel(new GridLayout(2,0));
this.masterPanel.add(new JButton("left button"));
this.masterPanel.add(new JButton("right button"));
this.masterPanel.add(this.getLeftPanel());
this.masterPanel.add(this.getRightPanel());

}
return masterPanel;
}

public JPanel getLeftPanel() {
if (this.leftPanel == null) {
this.leftPanel = new JPanel() {
Image image = Toolkit.getDefaultToolkit().createImage("/home/zack/Pictures/bb.jpeg");
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image,0,0,this.getWidth(),this.getHeig ht(),null);
}
};
}
return leftPanel;
}

public JPanel getRightPanel() {
if (this.rightPanel == null) {
this.rightPanel = new JPanel(){
Image image = Toolkit.getDefaultToolkit().createImage("/home/zack/Pictures/babak.jpeg");
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image,0,0,this.getWidth(),this.getHeig ht(),null);
}
};
}
return rightPanel;
}

public static void main(String[] s) {
new MyFrame();
}
}

من این مثال رو با gridlayout نوشتم می تونی بری باقی layout ها رو هم ببینی و بخونی. کلک اینه که panle تو panle با layout های مختلف درست کنی تا قالبی که می خوای رو بدست بیاری

در ضمن من حاجی نیستم. مشکلاتم توی فروم بصورت عمومی بزار تا خصوصی اینطور خیلی ها می تونن بهت کمک کنن حتی بهتر از من

pouria_bayat
سه شنبه 09 فروردین 1390, 22:47 عصر
سلام امكانش هست كه Jpanel ايجاد بشه و بعد از اجراي برنامه اصلي( يعني برنامه بالا بياد و بعد عكس مربوط به jpanel در درون فايل متني خوانده بشه و نمايش پيدا كنه؟
هنگام ساخت Jpanel نه زماني كه ما jpanel رو new كرديم وjpanel‌ايجادشد نه بلكه برنامه اجرا بشه و jpanel بدون عكس نمايش پيدا كنه و سپس عكس از طريق صدا زدن يك تابع ديگه و ارسال شي Jpanel ايجاد شده به اون تابع از طريق اون تابع عكس داخل jpanel قرار بگيره؟
در ضمن من از netbeans‌استفاده مي كنم و طراحي اوليه رو اونجا انجام ميدم.

خيلي مهمه لطفا كمك كنيد.

javaphantom
چهارشنبه 10 فروردین 1390, 14:13 عصر
سلام امكانش هست كه Jpanel ايجاد بشه و بعد از اجراي برنامه اصلي( يعني برنامه بالا بياد و بعد عكس مربوط به jpanel در درون فايل متني خوانده بشه و نمايش پيدا كنه؟
هنگام ساخت Jpanel نه زماني كه ما jpanel رو new كرديم وjpanel‌ايجادشد نه بلكه برنامه اجرا بشه و jpanel بدون عكس نمايش پيدا كنه و سپس عكس از طريق صدا زدن يك تابع ديگه و ارسال شي Jpanel ايجاد شده به اون تابع از طريق اون تابع عكس داخل jpanel قرار بگيره؟
در ضمن من از netbeans‌استفاده مي كنم و طراحي اوليه رو اونجا انجام ميدم.

خيلي مهمه لطفا كمك كنيد.


public class MyFrame extends JFrame {

private JLabel myLabel;
private JButton myButton;


public MyFrame() {



this.setBounds(new Rectangle(300,300));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());
this.getContentPane().add(this.getMyLabel());
this.getContentPane().add(this.getMyButton());
this.setVisible(true);


}

public JLabel getMyLabel() {
if (this.myLabel == null) {
this.myLabel = new JLabel("pic");

}
return myLabel;
}

public JButton getMyButton() {
if(this.myButton == null) {
this.myButton = new JButton("click");
this.myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Image image = Toolkit.getDefaultToolkit().createImage("/home/Babak/Downloads/gog.png");
ImageIcon imageIcon = new ImageIcon(image);
getMyLabel().setIcon(imageIcon);
}
});

}
return myButton;
}


public static void main(String[] s) {
new MyFrame();
}
}

pouria_bayat
چهارشنبه 10 فروردین 1390, 19:15 عصر
در قابل رويداد كليك بلدم اقا بابك ميشه كاري كرد كه نيازي به فشردن دكمه نباشه؟

javaphantom
پنج شنبه 11 فروردین 1390, 11:27 صبح
یک مثال ملموس بزن. یا اولش باید بیاد یا یک اتفاقی بی افته تا عکس بیاد دیکه

pouria_bayat
پنج شنبه 11 فروردین 1390, 23:46 عصر
به عنوان مثال مثل يك slide show كه خودش عكسرو چنج ميكنه و نيازي به فشردن دكمه نيست...

javaphantom
جمعه 12 فروردین 1390, 11:30 صبح
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;

/**
* Created by IntelliJ IDEA.
* User: Babak
* Date: 3/30/11
* Time: 2:10 PM
* To change this template use File | Settings | File Templates.
*/
public class MyFrame extends JFrame {

private JLabel myLabel;
private JButton myButton;
private java.util.Timer timer;


public MyFrame() {

this.setBounds(new Rectangle(300,300));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());
this.getContentPane().add(this.getMyLabel());
this.getContentPane().add(this.getMyButton());
this.setVisible(true);

timer = new Timer();
timer.schedule(new Slider(this),2000,2000);


}

public JLabel getMyLabel() {
if (this.myLabel == null) {
this.myLabel = new JLabel("pic");

}
return myLabel;
}

public JButton getMyButton() {
if(this.myButton == null) {
this.myButton = new JButton("click");
this.myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Image image = Toolkit.getDefaultToolkit().createImage("/home/Babak/Downloads/gog.png");
ImageIcon imageIcon = new ImageIcon(image);
getMyLabel().setIcon(imageIcon);
}
});

}
return myButton;
}


public static void main(String[] s) {
new MyFrame();
}
}




import javax.swing.*;
import java.awt.*;
import java.util.TimerTask;

/**
* Created by IntelliJ IDEA.
* User: Babak
* Date: 4/1/11
* Time: 11:43 AM
* To change this template use File | Settings | File Templates.
*/
public class Slider extends TimerTask {

private MyFrame myFrame;

private String[] pics = {"/home/Babak/Downloads/gog.png", "/home/Babak/Downloads/loadinfo.net.gif"};
private int slideCounter;
private Image image;
private ImageIcon imageIcon = new ImageIcon();

public Slider(MyFrame myFrame) {
this.myFrame = myFrame;
}

/**
* The action to be performed by this timer task.
*/
@Override
public void run() {

System.out.println("slideCounter = " + slideCounter);
System.out.println("pics[slideCounter] = " + pics[slideCounter]);

image = Toolkit.getDefaultToolkit().createImage(pics[slideCounter]);
imageIcon.setImage(image);
myFrame.getMyLabel().setIcon(imageIcon);
myFrame.getMyLabel().repaint();
slideCounter ++;
if (slideCounter > pics.length-1) {
slideCounter = 0;
}

}
}


هر دو ثانیه با تاخیر اولیه ۲ ثانیه برات دوتا عکس رو که بصورت استاتیک آدرس رو براشون ست کردم نشون میده