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

add action Listener

بدأه محــمد في 19 أبريل 2010 · 14 رد · 2,715 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مساء الكود المفقود

مساء ان تبحث عن كود ولا تجده

مساء انت تبحث عن حل.. ويقول حدسك .. اذهب إلى الفريق العربي هناك تجد ضالتك

مساء خيركم :)

في البدايه .. سابقاً في موضوع قديم لي .. وضعت برنامج Quiz Card

وكنت اعاني من مشكله بسيطه فيه .. وبمساعدتكم استطعت حلها

الآن .. اريد تطوير هذا البرنامج .. تطوير بسيط

لهذا انا هنا .. كعادتي احتاج إلى المساعده حتى في ابسط الأمور

فهلا ساعدتموني ؟ :)

البرنامج عباره عن 3 اقسام:

* بناء ملفات فلاشيه .. QuizCardBuilder

*مكان الحفظ.. QuizCard

*مشغل الفلاشات.. QuizCardPlayer

QuizCardBuilder

يقوم بعرض نافذه "بطاقه" تحتوي على 2 textArea " خانة السؤال , وخانة الجواب "

هذا البرنامج لإنشاء البطاقات..

يعطيك خاصية كتابة السؤال.. كتابة الجواب.. وعند الضغط على next card يقوم بحفظ ما كتب في السؤال والجواب في ArrayList<QuizCard> ثم يقوم بتنظيف الخانات للكرت التالي

وخاصية الحفظ من ايقونة file...saveFile

_______

QuizCard

هو المكان الذي تحفظ فيه البطاقات..

_______

QuizCardPlayer

هو البرنامج المشغل..

يسألك عن اي بطاقه تريد تشغيلها من ايقونة.. file... openFile

يتصل بـ QuizCard ويشغل البطاقه المختاره

____

طبعاً يتم تشغيل البرنامج بالطريقه التاليه :

اولاً تشغيل QuizCardBuilder عن طريق run طبعاً .. ثم كتابة الأسئله والإجابات وحفظهم

لكن لا تستطيع عرضهم إلا عن طريق QuizCardPlayer وبلستخدام run من جديد من الكود

ما هو المطلوب...؟

اريد ان اضع JButton في QuizCardBuilder ينقلني إلى QuizCardPlayer والعكس ايضاً..

بدون الحاجه إلى تشغيل كل برنامج على حده

لكي يتيح للمستخدم الإنتقال بينهم عن طريق الأزرار في ما لو حولت البرنامج إلى jar دون الرجوع إلى الكود

النهايه.. :)

لا تلوموني احس اني كتبت روايه .. طولت عليكم

نداء ما كان بعيداً

#2

السلام عليكم

اذهب الى الرابط التالى و حمل ما فى المرفقات اعتقد انك تقصد كدة

/index.php?showtopic=218013&st=0

لو تقصد حاجة تانية يا ريت تقول علشان الاعضاء يساعدوك

00020309t.gif

1958_1963.gif
#3

هل تريد أن تظهر نافذة أخرى عند الضغط على الزر، أم أنك تريد البقاء في نفس النافذة، لكن مع تغيير محتوى هذه النافذة كلما ضغطت على الزر.

اقتباس
لكي يتيح للمستخدم الإنتقال بينهم عن طريق الأزرار في ما لو حولت البرنامج إلى jar دون الرجوع إلى الكود

ماذا تقصد؟

#4
اقتباس
* بناء ملفات فلاشيه .. QuizCardBuilder

*مكان الحفظ.. QuizCard

*مشغل الفلاشات..

يجب ان يكون كل منهم عبارة عن نافذة (JFrame Class)

public class QuizCardBuilder extends javax.swing.JFrame....
public class QuizCard extends javax.swing.JFrame....
public class QuizCardPlayer extends javax.swing.JFrame....

يمكن التناقل بينهم عن طريق صنع كائن منهم على حدة

مثل

QuizCard quizCardWindow=new QuizCard ();
quizCardWindow.setVisiable(true);
#5

اعذروني نسيت ان ارفق الكود .. لتتضح الرؤيه

QuizCardBuilder
_____




import java.util.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class QuizCardBuilder {

    private JFrame frame;
    private JTextArea question;
    private JTextArea answer;
    private ArrayList<QuizCard> cardList;

    public static void main (String[] args) {
        QuizCardBuilder builder = new QuizCardBuilder();
        builder.go();
    }

    public void go() {

        frame = new JFrame("QuizCardBuilder");
        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        Font  bigFont = new Font("sanserif", Font.BOLD, 24);
        question = new JTextArea(6,20);
        question.setLineWrap(true);
        question.setWrapStyleWord(true);
        question.setFont(bigFont);
        //panel.setBackground(Color.blue);
        //panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        JScrollPane qScroller = new JScrollPane(question);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        //panel.add(scroller);

        answer = new JTextArea(6,20);
        answer.setLineWrap(true);
        answer.setWrapStyleWord(true);
        answer.setFont(bigFont);

        JScrollPane aScroller = new JScrollPane(answer);
        aScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        aScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        JButton nextButton = new JButton("Next Card");
        //aButton.addActionListtener(new ShowListener());
        //panel.add(aButton);

        cardList = new ArrayList<QuizCard>();

        JLabel qLabel = new JLabel("Question");
        JLabel aLabel = new JLabel("Answer");

        mainPanel.add(qLabel);
        mainPanel.add(qScroller);
        mainPanel.add(aLabel);
        mainPanel.add(aScroller);
        mainPanel.add(nextButton);
        nextButton.addActionListener(new NextCardListener());
        //JButton qButton = new JButton("next card");
        //qButton.addActionListener(new cardListener());

        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu ("File");
        JMenuItem newMenuItem = new JMenuItem("New");
        JMenuItem saveMenuItem = new JMenuItem("Save");
        newMenuItem.addActionListener(new NewMenuListener());

        saveMenuItem.addActionListener(new SaveMenuListener());
        fileMenu.add(newMenuItem);
        fileMenu.add(saveMenuItem);
        menuBar.add(fileMenu);
        frame.setJMenuBar(menuBar);
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        frame.setSize(500,600);
        frame.setVisible(true);
        //frame.getContentPane().add(BorderLayout.CENTER, panel);
        //frame.getContentPane().add(BorderLayout.CENTER, aButton);
    }
//    public class TextListener implements ActionListener {
//        public void actionPerformed(ActionEvent event) {
//            text.append("button clicked \n ");
//        }
//    }
//    class ShowListener implements ActionListener {
//        public void actionPerformed(ActionEvent event) {
//            // add qButton
//        }
//    }
    public class NextCardListener implements ActionListener {
            public void actionPerformed(ActionEvent ev) {
                QuizCard card = new QuizCard(question.getText(), answer.getText());
                cardList.add(card);
                clearCard();
            }
        }
    public class SaveMenuListener implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            QuizCard card = new QuizCard(question.getText(), answer.getText());
            cardList.add(card);

            JFileChooser fileSave = new JFileChooser();
            fileSave.showSaveDialog(frame);
            saveFile(fileSave.getSelectedFile());
        }
    }
    public class NewMenuListener implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            cardList.clear();
            clearCard();
        }
    }
    private void clearCard() {
        question.setText("");
        answer.setText("");
        question.requestFocus();
    }
    private void saveFile(File file) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(file));

            for(QuizCard card:cardList) {
                writer.write(card.getQuestion() + "/");
                writer.write(card.getAnswer() + "\n");
            }
            writer.close();
        } catch(IOException ex) {
            System.out.println("couldn't write the cardList out");
            ex.printStackTrace();
        }
    }
}



___________


QuizCardPlayer 




import java.util.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.io.BufferedReader;

public class QuizCardPlayer {

    private JFrame frame;
    private JTextArea display;
    private JTextArea answer;
    private ArrayList<QuizCard> cardList;
    private QuizCard currentCard;
    private int currentCardIndex;
    private JButton nextButton;
    private boolean isShowAnswer;

    public static void main (String[] args) {
        QuizCardPlayer reader = new QuizCardPlayer();
        reader.go();
    }

    public void go() {

        frame = new JFrame("QuizCardPlayer");
        JPanel mainPanel = new JPanel();
        Font  bigFont = new Font("sanserif", Font.BOLD, 24);

        display = new JTextArea(10,20);
        display.setLineWrap(true);
        display.setEditable(false);
        display.setFont(bigFont);

        JScrollPane qScroller = new JScrollPane(display);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        nextButton = new JButton("Show Question");
        mainPanel.add(qScroller);
        mainPanel.add(nextButton);
        nextButton.addActionListener(new NextCardListener());

        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu ("File");
        JMenuItem loadMenuItem = new JMenuItem("load card set");
        loadMenuItem.addActionListener(new OpenMenuListener());

        fileMenu.add(loadMenuItem);
        menuBar.add(fileMenu);
        frame.setJMenuBar(menuBar);
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        frame.setSize(640,500);
        frame.setVisible(true);
    } //close go

    public class NextCardListener implements ActionListener {
            public void actionPerformed(ActionEvent ev) {
                if (isShowAnswer) {
                    display.setText(currentCard.getAnswer());
                    nextButton.setText("Next Card");
                    isShowAnswer = false;
                } else {
                    if (currentCardIndex < cardList.size()) {
                        showNextCard();
                    } else {
                        display.setText("That was last card");
                        nextButton.setEnabled(false);
                    }
            }
        }
    }
    public class OpenMenuListener implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            JFileChooser fileOpen = new JFileChooser();
            fileOpen.showOpenDialog(frame);
            loadFile(fileOpen.getSelectedFile());
        }
    }
    private void loadFile (File file) {
        cardList = new ArrayList<QuizCard>();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = null;
            while ((line = reader.readLine()) != null) {
              makeCard(line);
        }
            reader.close();
        } catch(Exception ex) {
            System.out.println("could't read the card file");
            ex.printStackTrace();
        }
        showNextCard();
    }
    private void makeCard(String lineToParse) {
        String[] result = lineToParse.split("/");
        QuizCard card = new QuizCard(result[0], result[1]);
        cardList.add(card);
        System.out.println("made a card");
    }
    private void showNextCard() {
        currentCard = cardList.get(currentCardIndex);
        currentCardIndex++;
        display.setText(currentCard.getQuestion());
        nextButton.setText("Show Answer");
        isShowAnswer = true;
    }
}//close class



_________


QuizCard


import java.io.*;

public class QuizCard implements Serializable {
    String question;
    String answer;

    public QuizCard(String q,String a) {
        question = q;
        answer = a;
    }

    public String getQuestion() {
        return question;
    }
    public String getAnswer() {
        return answer;
}
}

نداء ما كان بعيداً

#6

اسراء شلبى.. شكراً كبيره

إن شاء الله بأطلع على الموضوع بتركيز اكثر .. اعتقد اني بستفيد كثير

_____

JustPassing

اقصد يفتح نافذه جديده .. سواء كانت هيه نافذة QuizCardBuilder او QuizCardPlayer

اما بالنسبه للجار اقصد.. ان البرنامج الآن اشغل QuizCardBuilder و QuizCardPlayer من الكود نفسه عن طريق النيت بينز

لما اعمله jar executable اريد ان انتقل بين البرنامجين عن طريق الأزرار

______

Mohammed Mshari Ersan

اقتباس
يجب ان يكون كل منهم عبارة عن نافذة (JFrame Class)

يمكن التناقل بينهم عن طريق صنع كائن منهم على حدة

اعلم هذا يا صاحبي .. لكني اخطأت لأني لم اضع الكود لأوضح الفكره

شكراً لك عليك :)

تم تعديل هذه المشاركة بواسطة محمد_ح في 19 أبريل 2010 في 20:22

نداء ما كان بعيداً

#7

في رأسي فكره..

لو قمت بوضع هذا الكود في QuizCardPlayer

فهل بالزر cardBuilder يتم تشغيل QuizCardBuilder من نافذة QuizCardPlayer ؟

        JButton cardBuilder = new JButton("Builder");
        cardBuilder .addActionListener(new BuilderListener ());



    public class BuilderListener implements ActionListener {
            public void actionPerformed(ActionEvent ev) {
                  QuizCardBuilder builder = new QuizCardBuilder();
        builder.go();
            }
        }

نداء ما كان بعيداً

#8

كلام سليم

لكن بالنسبة الي هذا الحل غير صحيح بالبرمجة الموجهة

حيث انت لا تمتلك خصائص ال JFrame في هذه الحالة

اعتقد من الافضل ان يكون كل صف هو امتداد ل JFrame

#9

شباااااااب انا بــــطــــل :lol:

جربت الكود ونجحت الفكره

:thumb_up:

thank u very much

Mohammed Mshari Ersan كتب:

حيث انت لا تمتلك خصائص ال JFrame في هذه الحالة

اعتقد من الافضل ان يكون كل صف هو امتداد ل JFrame

ماذا تعني بهذا ؟!

بالإضافة إلى هذا الكود انا وضعت كود لل JFrame هذا هو :

        mainPanel.add(cardBuilder);

هل هذا ما تقصد؟

نداء ما كان بعيداً

#10
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class QuizCardPlayer extends JFrame implements ActionListener {

    private JTextArea display;
    private JTextArea answer;
    private ArrayList<QuizCard> cardList;
    private QuizCard currentCard;
    private int currentCardIndex;
    private JButton nextButton;
    private boolean isShowAnswer;

    public QuizCardPlayer() {
        super("QuizCardPlayer");//**

        JPanel mainPanel = new JPanel();
        Font bigFont = new Font("sanserif", Font.BOLD, 24);

        display = new JTextArea(10, 20);
        display.setLineWrap(true);
        display.setEditable(false);
        display.setFont(bigFont);

        JScrollPane qScroller = new JScrollPane(display);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        nextButton = new JButton("Show Question");
        mainPanel.add(qScroller);
        mainPanel.add(nextButton);
        nextButton.addActionListener(this);//**

        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenuItem loadMenuItem = new JMenuItem("load card set");
        loadMenuItem.addActionListener(new OpenMenuListener());

        fileMenu.add(loadMenuItem);
        menuBar.add(fileMenu);
        setJMenuBar(menuBar);//**
        getContentPane().add(BorderLayout.CENTER, mainPanel);//**
        setSize(640, 500);//**
    }
    //***//
    public void actionPerformed(ActionEvent e) {
        if (isShowAnswer) {
            display.setText(currentCard.getAnswer());
            nextButton.setText("Next Card");
            isShowAnswer = false;
        } else {
            if (currentCardIndex < cardList.size()) {
                showNextCard();
            } else {
                display.setText("That was last card");
                nextButton.setEnabled(false);
            }
        }
        ///****///
        // here you can add your button cardBuilder action
    }

    public class OpenMenuListener implements ActionListener {

        public void actionPerformed(ActionEvent ev) {
            JFileChooser fileOpen = new JFileChooser();
            fileOpen.showOpenDialog(QuizCardPlayer.this);//**
            loadFile(fileOpen.getSelectedFile());
        }
    }

    private void loadFile(File file) {
        cardList = new ArrayList<QuizCard>();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = null;
            while ((line = reader.readLine()) != null) {
                makeCard(line);
            }
            reader.close();
        } catch (Exception ex) {
            System.out.println("could't read the card file");
            ex.printStackTrace();
        }
        showNextCard();
    }

    private void makeCard(String lineToParse) {
        String[] result = lineToParse.split("/");
        QuizCard card = new QuizCard(result[0], result[1]);
        cardList.add(card);
        System.out.println("made a card");
    }

    private void showNextCard() {
        currentCard = cardList.get(currentCardIndex);
        currentCardIndex++;
        display.setText(currentCard.getQuestion());
        nextButton.setText("Show Answer");
        isShowAnswer = true;
    }
}//close class

بالنسبة لي يكون الكود هكذا اصح بعض الشيء

اعتذر لم اقرأ كامل الكود (انا بالشغل)

اي شيء بجنبه

**// هو ما قمت بتعديله

#11

مساء الخير

عذراً على هذا الإنقطاع لبضعة ايام بسبب الظروف

عزيزي محمد .. لاحضت بعض التغييرات في الكود :

جعلت الـ JFrame كـ superclass .. اول مره اعرف انه بالإمكان عمل extendes لل JFrame

لكنها طريقه جميله

جعلت الـ NextCardListener كـ انترفيس للكلاس .. فكره جميله لكن على حد علمي انه بالإمكان عمل اكثر من implement فهل يمكنني وضع اكثر من Listener كـ implement ؟

إذا كان بالإمكان.. كيف استطيع التحكم بهم ؟ وكيف استدعيهم بـ this ?

لماذا حذفت الجمله

 frame.setVisible(true);

انت حذفت الـ main method وحذفت الـ go method ووضعت الكود في الـ constructor

طيب لو حبيت استدعي البرنامج من الـ QuizCardBuilder .. استدعيه عن طريق الـ constructor بدل الميثود go?

اعذرني على كثرة الأسأله لكني ابي اطور فهمي للبرمجه بدل التركيز على الكتاب

شكراً لك عليك :)

تم تعديل هذه المشاركة بواسطة محــمد في 25 أبريل 2010 في 16:30

نداء ما كان بعيداً

#12

حذفت

 frame.setVisible(true);

لانك سوف تصنع كائن من كل صف على حدا

و هذه الخاصية تقوم باظهار النافذذة و اخفائها

و يمكن اعادة استخدام الكائن نفسه

و بدل كل هالامور

بامكانك صنع كائن من جديد

و ذلك باستدعاء الconstructor

#13

لم افهم قصدك بصنعي كائن من كل صف .. هل تقصد تكراري لكلمة frame?

طيب لما حذفت الـ main method وحذفت الـ go method ووضعت الكود في الـ constructor

طيب لما اردت ان استدعي البرنامج من الـ QuizCardBuilder .. انت تقول استدعيه عن طريق الـ constructor بدل الميثود go

وضعت هذا الكود

public class PlayerListener implements ActionListener {
            public void actionPerformed(ActionEvent ev) {
                  QuizCardPlayer Player = new QuizCardPlayer();
       // Player.go();
            }
        }

لكن لم يحدث شيء .. لم يعمل QuizCardPlayer عند ضغطي على زر Player من نافذة QuizCardBuilder

لأنه لم يعد هناك main method لتشغيل البرنامج

هلا اوضحت لي بتفصيل اكثر ؟

نداء ما كان بعيداً

#14

هل من احد يستطيع المساعده في كيفية تشغيل QuizCardPlayer بالطريقه التي تكلم عنها الأخ Mohammed Mshari Ersan

عندما حذف الـ main method وحذف الـ go method ووضع الكود في الـ constructor

ان يعمل QuizCardPlayer عند ضغطي على زر Player من نافذة QuizCardBuilder

لأنه لم يعد هناك main method لتشغيل البرنامج

ما العمل الآن ؟ وقف برنامجي عن العمل

نداء ما كان بعيداً

#15
public class PlayerListener implements ActionListener {
            public void actionPerformed(ActionEvent ev) {
                  QuizCardPlayer Player = new QuizCardPlayer();
       Player.setVisable(true);//*******
            }
        }

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