الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه h.shehari في 24 نوفمبر 2012 · 2 رد · 884 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

قمت بكتابة برنامج عباره عن عجلة مكونة من 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();
        //}
    }

}

يبيبي

#2

تفضل اخى الكريم الكود بتاعك , لكن بعد اضافة احداث لكل من 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
#3

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

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

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

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

شكرا مره اخرى

مواضيع مشابهة