• 0
h.shehari

اضافة حدث Action الى JButton

سؤال

السلام عليكم

قمت بكتابة برنامج عباره عن عجلة مكونة من 6 اقسام كل قيم بلون مختلف، وهذه العجله تتحرك بشكل دائري فتبدوا انها تسير

طبعا استخدمت paintComponent لاتمكن من استخدام Timer لتصبح العجلة متحركه وايضا استخدمت extends JPanel وليس JFrame لأتمن من استخدام paintComponent

المشكلة الان البرنامج يعمل بشكل طبيعي لكني اردت تطويره واضافة زرين احدهما للتشغيل والاخر للايقاف (وقد اضيف ادواات تحكم اخرى بعد ان تحل المشكلة)

لكن المشكلة انني لم اتمكن من اضافة الحدث Action الى الزر JButton حيث اني قمت بتعريف الزر في دالة الmain وطبعا لا استطيع ان اعرف الزر في مكان اخر لاني استخدمت الextends JPanel

أتمنى منكم المساعدة اة اقتراح الافكار لتنفيذ المطلوب

طبعا اضفت الاكشن ضمن تعليقات وايضا سأقوم بحذف دالة Timer.start() من الpaintComponent واضيفها الى حدث الزر


import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.Timer;

/**
*
* @author HASSAN
*/
public class ExamWheel extends JPanel implements ActionListener {

private int i=0;
Boolean doDraw = true;
Timer tm = new Timer(10, this);

public void paintComponent(Graphics graphics) {
if (doDraw){
super.paintComponent(graphics);
Graphics2D g = (Graphics2D) graphics;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g.setColor(Color.CYAN);
g.fillArc(50, 50, 300, 300, i+0, 60);
g.setColor(Color.red);
g.fillArc(50, 50, 300, 300, i+60, 60);
g.setColor(Color.green);
g.fillArc(50, 50, 300, 300, i+120, 60);
g.setColor(Color.blue);
g.fillArc(50, 50, 300, 300, i+180, 60);
g.setColor(Color.gray);
g.fillArc(50, 50, 300, 300, i+240, 60);
g.setColor(Color.pink);
g.fillArc(50, 50, 300, 300, i+300, 60);
}
tm.start();//I want to delet the start() method from paintComponent and write it in b_satrt action method
}


public static void main(String[] args) {
JFrame jf = new JFrame();
ExamWheel wheel = new ExamWheel();
JButton b_start = new JButton("Start");
JButton b_stop = new JButton("Stop");
JSlider slider = new JSlider();
JPanel p1 = new JPanel(new GridLayout(0, 1));
JPanel p2 = new JPanel();

p1.setPreferredSize(new Dimension(400,400));
p1.add(wheel);
p2.setPreferredSize(new Dimension(400,100));
p2.setBackground(Color.gray);
p2.add(b_start);
p2.add(b_stop);

jf.setSize(400,550);
jf.setResizable(false);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
jf.setTitle("Wheel..");
jf.add(p1, BorderLayout.NORTH);
jf.add(p2, BorderLayout.SOUTH);
}

public void actionPerformed(ActionEvent e) {
i++;
repaint();
//if(e.getSource() == b_start){
// doDraw=true;
// tm.start();
//}else if(e.getSource() == b_stop){
// doDraw=false;
// tm.stop();
//}
}

}

يبيبي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

2 إجابة على هذا السؤال .

  • 0

تفضل اخى الكريم الكود بتاعك , لكن بعد اضافة احداث لكل من start and stop buttons


import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.Timer;

/**
*
* @author HASSAN
*/
public class ExamWheel extends JPanel implements ActionListener {

private int i=0;
Boolean doDraw = true;
Timer tm = new Timer(10, this);
// 1- Define these buttons here to be visiable in the actionPerformed method , use static to be visiable in main method
static JButton b_start = new JButton("Start");
static JButton b_stop = new JButton("Stop");

public void paintComponent(Graphics graphics) {
if (doDraw){
super.paintComponent(graphics);
Graphics2D g = (Graphics2D) graphics;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g.setColor(Color.CYAN);
g.fillArc(50, 50, 300, 300, i+0, 60);
g.setColor(Color.red);
g.fillArc(50, 50, 300, 300, i+60, 60);
g.setColor(Color.green);
g.fillArc(50, 50, 300, 300, i+120, 60);
g.setColor(Color.blue);
g.fillArc(50, 50, 300, 300, i+180, 60);
g.setColor(Color.gray);
g.fillArc(50, 50, 300, 300, i+240, 60);
g.setColor(Color.pink);
g.fillArc(50, 50, 300, 300, i+300, 60);
}
// 2- addActionListener to them
b_start.addActionListener(this);
b_stop.addActionListener(this);
//tm.start();//I want to delet the start() method from paintComponent and write it in b_satrt action method
}


public static void main(String[] args) {
JFrame jf = new JFrame();
ExamWheel wheel = new ExamWheel();
JSlider slider = new JSlider();
JPanel p1 = new JPanel(new GridLayout(0, 1));
JPanel p2 = new JPanel();

p1.setPreferredSize(new Dimension(400,400));
p1.add(wheel);
p2.setPreferredSize(new Dimension(400,100));
p2.setBackground(Color.gray);
p2.add(b_start);
p2.add(b_stop);

jf.setSize(400,550);
jf.setResizable(false);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
jf.setTitle("Wheel..");
jf.add(p1, BorderLayout.NORTH);
jf.add(p2, BorderLayout.SOUTH);
}

public void actionPerformed(ActionEvent e) {

i++;
repaint();
if(e.getSource() == b_start){
doDraw=true;
tm.start();
}else if(e.getSource() == b_stop){
doDraw=false;
tm.stop();
}
}

}

هناك تعليقات فوق التعديلات البسيطه جداا التى اضيفت

تحياتى :)

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا جزيلا اخي

لم أكن أعرف انه يمكنني اضافة احداث للأزرار في دالة paintComponent

لقد افدتني كثيرا

سأحاول الان اضافة Slider ليتمكن المستخدم من التحكم بسرعة العجلة والمهم عرفت كيف اضيف احداث في هذه الحالة

شكرا مره اخرى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .