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

مشكلة فى ال MouseListener

بدأه mr.beshoy في 10 يونيو 2011 · 11 رد · 455 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أعمل فى برمجة لعبة ترتيب ال 8 أرقام (3 صفوف و 3 أعمدة - كل صف به 3 خانات بهم 3 أرقام ما عدا الصف الأخير به رقمين و الخانة الأخيرة فارغة للتحريك فيها )

-------------------------------------------------------

مبدئياً فى بداية اللعبة تكون الخانة الأخيرة فى الصف الأخير و العمود الأخير فارغة (مرفق صورة للتوضيح)

------------------------------------------------------------------------------

عندما أحرك الرقم الأخير فى الصف الثانى فى العمود الأخير [0][1] >>>> [row][col] للخانة الفارغة فى الصف الأخير و العمود الأخير [0][0] >>>>> [row][col]

من خلال الضغط على الخلية [0][1] ينتقل الرقم بكل بساطة إلى الخلية الفارغة [0][0] و بالتالى أصبحت الخلية [0][1] فارغة و الخلية [0][0] بها الرقم و كل ذلك من خلال ال mousePressed() + بعض الإضافات حتى تتم العملية .

و لكن عندما أريد التحريك مرة أخرى و لكن فى هذه المرة من الخلية [0][0] >>>>>>>> [row][col] التى بها الرقم إلى الخلية الفارغة [0][1] >>>>>> [row][col] لا ينتقل الرقم !!! لماذا ؟!!

حاولت معها و لكن لم أتوصل لسبب المشكلة .

أتمنى أن أعرف الطريقة الصحيحة منكم .

انظر فى ال class NumbersPuzzelGUI و بداخله classs MyMouseListener الذى فيه المشكلة .

ال code مرفق + صورة توضيحية

8puzzel.rar

#2

يا جماعة حد يرد عليَّ

#3

اولا دعنا نبدأ بالاخطاء السطر

  emptyBlock[x - 1][y] = new JLabel();

يسبب استثناء من نوع ArrayIndexOutOfBoundsException عندما يتم الاستدعاء على x = 0 , y = 0

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

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#4
mental-driller كتب:

اولا دعنا نبدأ بالاخطاء السطر

  emptyBlock[x - 1][y] = new JLabel();

يسبب استثناء من نوع ArrayIndexOutOfBoundsException عندما يتم الاستدعاء على x = 0 , y = 0

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

انا عارف ان السطر ده لو ضغطت عليه هيطلع ArrayIndexOutOfBoundsException

لكن انا كنت بحل مشكلة مشكلة .... ال هى سبق وتكلمت عنها فى أول مشاركة

أتمنى تساعدنى

#5

شوف التعديل اللي انا عامله في الكود بتاعك ودا الوقتي شغال

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.*;

public class NumbersPuzzelGUI extends JPanel {

    private JPanel mainPanel;
    private JPanel[][] myBoard;
    private JLabel[][] label;
    private List<Integer> list = new ArrayList<Integer>();
    private Random random = new Random();
    private final int x_size = 3, y_size = 3, numbersRange = 8;
    private int num;
    private MyMouseListener myMouseListener;
    private Cursor cursor = new Cursor(Cursor.HAND_CURSOR);

    public NumbersPuzzelGUI() {
        myMouseListener = new MyMouseListener();
        mainPanel = new JPanel(new GridLayout(3, 3));
        mainPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE, 3));
        myBoard = new JPanel[x_size][y_size];
        label = new JLabel[x_size][y_size];
        _createBoard();
    }

    private void _createBoard() {
        for (int x = 0; x <= x_size - 1; x++) {
            for (int y = 0 ; y <= y_size - 1; y++) {
                myBoard[x][y] = new JPanel();
                label[x][y] = new JLabel();
                label[x][y].addMouseListener(myMouseListener);
                if (x == 0 && y == 0) {
                    label[y][x].setText("");
                    myBoard[y][x].setBorder(BorderFactory.createEtchedBorder());
                    _createCell(x, y);
                } else {
                    label[x][y].setText(String.valueOf(_showRandomNumber()));
                    myBoard[x][y].setBorder(BorderFactory.createEtchedBorder());
                    _createCell(x, y);
                }
            }
        }
        add(mainPanel);
    }

    private void _createCell(int x, int y) {
        label[x][y].setPreferredSize(new Dimension(20, 20));
        myBoard[x][y].add(label[x][y]);
        myBoard[x][y].setPreferredSize(new Dimension(50, 50));
        mainPanel.add(myBoard[x][y]);

    }

    private int _showRandomNumber() {
        for (int i = numbersRange; i > 0; i--) {
            num = random.nextInt(9);
            while (list.contains(num) || num == 0) {
                num = random.nextInt(9);
            }
            System.out.println(num);
            list.add(num);
            return num;
        }
        return 0;
    }

    private class MyMouseListener extends MouseAdapter {

        @Override
        public void mouseEntered(MouseEvent e) {
            for (int x = x_size - 1; x >= 0; x--) {
                for (int y = y_size - 1; y >= 0; y--) {
                    if (e.getSource() == label[x][y]) {
                        JLabel label = (JLabel) e.getSource();
                        label.setCursor(cursor);
                        System.out.println("label" + "" + label.getText());
                    }
                }
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
            for (int x = x_size - 1; x >= 0; x--) {
                for (int y = y_size - 1; y >= 0; y--) {
                    if (e.getSource() == label[x][y]) {
                        JLabel labelL = (JLabel) e.getSource();
                        String str = labelL.getText();
                        if (x == 0 && y == 0) {
                            System.out.println("x 0 y 0");
                            _moveInLastColumn(labelL, x, y, str);
                        } else if (x == 1 && y == 0) {
                            System.out.println("x 1 y 0");
                            _moveInLastColumn(labelL, x, y, str);

                        }
                    }
                }
            }
        }

        private void _moveInLastColumn(JLabel labelL, int x, int y, String str) {

            System.out.println("labellllllllll" + "" + str);
            if (x-1 >=0 && label[x - 1][y].getText().equals("") ) {
                labelL.setText("");
                label[x - 1][y].setText(str);
                label[x - 1][y].setCursor(cursor);
                System.out.println("emptyBlock[x-1][y]" + "" + label[x - 1][y].getText());
                myBoard[x - 1][y].revalidate();
                myBoard[x - 1][y].repaint();
                myBoard[x - 1][y].removeAll();
                myBoard[x - 1][y].add(label[x - 1][y]);
            } else if (label[x + 1][y].getText().equals("")) {
                System.out.println("HIIIIIIIIIIIIIIIIIIIII");
                labelL.setText("");
                label[x + 1][y].setText(str);
                label[x + 1][y].setCursor(cursor);
                System.out.println("emptyBlock[x-1][y]" + "" + label[x + 1][y].getText());
                myBoard[x + 1][y].revalidate();
                myBoard[x + 1][y].repaint();
                myBoard[x + 1][y].removeAll();
                myBoard[x + 1][y].add(label[x + 1][y]);
            }
        }
    }
}

طبعا انا عامل الاسم labelL علشان لما بتستخدم نفس الاسم في الداله بيعمل shadowing على المصفوفه

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#6

حالاً قبل ما أرى ال code بتاعك كنت عملت بعض التعديلات منها انى استعملت نفس المتغير label عَوض ال emptyBlock

بس انا مش قادر أفهم فكرة ال

  if (x - 1 >= 0 && label[x - 1][y].getText().equals("")) {

معلش وضحلى أيه الهدف وضع الشرط ده x - 1 >= 0

شكراً

#7

انا بس بعمل check علشان اضمن ان x مايخرجش خارج المصفوفه يعني x = -1 حيدني ArrayIndexOutOfBoundsException

انت كمان مفروض تعمل check على x+1 علشان تضمن انه مش اكبر من length-1 بنفس الطريقه

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#8

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

و ده منظر ال method الجديد

        private void _moveInLastColumn(int x, int y, String str) {
            if (x - 1 >= 0 && label[x - 1][y].getText().equals("")) {
                label[x][y].setText("");
                label[x - 1][y].setText(str);
                myBoard[x - 1][y].add(label[x - 1][y]);
            } else if (x + 1 >= 0 && label[x + 1][y].getText().equals("")) {
                label[x][y].setText("");
                label[x + 1][y].setText(str);
                myBoard[x + 1][y].add(label[x + 1][y]);
            }
        }

تم تعديل هذه المشاركة بواسطة mr.beshoy في 10 يونيو 2011 في 21:25

#9

السطر ده

else if (x + 1 >= 0 && label[x + 1][y].getText().equals(""))

خليه كده

else if (x+1 <= label.length-1 && label[x + 1][y].getText().equals(""))

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#10
mental-driller كتب:

السطر ده

else if (x + 1 >= 0 && label[x + 1][y].getText().equals(""))

خليه كده

else if (x+1 <= label.length-1 && label[x + 1][y].getText().equals(""))

طب و ايه المشكلة لو تركته كما كتبته أنا

و ايه هدفك لما تقول x+1 <= label.length-1

مش ممكن نخليه كده x+1 <= label.length

؟؟؟؟؟

شكراً

#11

لو المصفوفه طولها مثلا 8 حيكون اخر index رقم 7 اللي هو length-1 لو عاوز تستخدم length بس يبقى اعمل

x+1 < label.length

المشكله عندك انه لو كان x اخر سطر في المربع حيكون x+1 خارج المربع يعني لو الطول 3 حيكون x+1 يشير الى السطر الرابع اللي هو اصلا مش موجود داخل المصفوفه

هنا في الحاله الاولي بنفحص الlower limit وفي الحالة الثانية بنفحص الupper limit

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#12

شكراً ، و العملية هتوضح أكثر مع باقى احتمالات الخلايا لما هنحركهم

و هكتشف الموضوع أكتير

شكرأً على تعبك

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