Убедитесь, что координата курсора мыши равна координате setBounds компонента

Это дополнительный вопрос к моему предыдущему вопросу. Я пытаюсь решить проблему в предыдущем вопросе. ссылка

Я кодирую игру-головоломку с изображением, и одна часть кода предназначена для сравнения частей, выбранных пользователем, с частями правильного изображения.

Каждая часть изображения уже добавлена ​​в JButton как ImageIcon.

Идентификатор необходим для различения каждой части изображения, а также для сравнения.

Я устанавливаю setName() для каждой JButton, созданной в качестве идентификатора.

Сравнение начинается, когда пользователь перемещает курсор мыши на определенную координату кнопки на другой сетке 3x3, когда пользователь перетаскивает элементы из исходной сетки 3x3.

Отредактировано: Отредактированный код помечен. Кажется, у Flex есть метод, который может обнаруживать объект, находящийся под курсором, есть ли он у java? Ссылка ^ getSource() решает указанную выше проблему.

Однако, когда я попытался system.out.println посмотреть, когда кнопка запускает getName(), оказалось, что она не запускается, когда я перетаскиваю части на кнопку; чтобы активировать getName(), я должен еще раз навести курсор на кнопку после перетаскивания фрагментов изображения на кнопку =/ .

private int mouseX,mouseY;
private JButton[] button = new JButton[9];
private JButton[] userarea = new JButton[9];

// setName for each of the 9 buttons in the original 3x3 grid being created 
// which stores the shuffled puzzle pieces
for(int a=0; a<9; a++){
    button[a] = new JButton(new ImageIcon());
    id += Integer.toString(++cc);
    button[a].setName(id); 
}

// create 9 buttons for the user to place the puzzle pieces to
for(int b=0; b<9; b++){
         userarea[b] = new JButton();
         id2 += Integer.toString(++cc2);
         // setName for each button (as unique id)
         userarea[b].setName(id2); 
         TransferHandler transfer1 = new TransferHandler("icon");
         userarea[b].setTransferHandler(transfer1);
    //<--- EDITED CODE ------>
            ChangeListener clistener = new ChangeListener(){                 
               public void stateChanged(ChangeEvent ce) {

                     JButton source = (JButton)ce.getSource();
                     ButtonModel mod = source.getModel(); 
                     if (mod.isRollover()){
                     System.out.println(source.getName());
                     }
                     else{

                 }
             }
         };
   //<--- EDITED CODE ------>
}


public void nameOfDestButton() {

            // not sure how to do this
            if(mouseCoordinate == getBounds of one of the buttons){
                userarea[appropriate button number].getName();
            }
}

public void mouseMoved(MouseEvent m){
        mouseX=m.getX();
        mouseY=m.getY();

        nameOfDestButton();

        // not sure how to do this. Obtaining a return value of getName
        // in the nameOfDestButton() method ?
        if (m.getComponent().getName().equals(nameOfDestButton) {  

        }
        else{
             JOptionPane.showMessageDialog(null,"Wrong! Try Again.");
        }
    }         

person iridescent    schedule 23.01.2013    source источник
comment
1) Чтобы быстрее получить помощь, опубликуйте SSCCE. 2) Почему вы пытаетесь определить границы компонентов? Это редко бывает необходимо.   -  person Andrew Thompson    schedule 23.01.2013
comment
1) Я старался изо всех сил размещать только соответствующий код. Я посмотрю, возможны ли еще сокращения кода :) 2) Это для получения координат каждой кнопки. Цель состоит в том, чтобы координата курсора мыши сравнивалась с координатой каждой кнопки, чтобы определить, над какой кнопкой в ​​данный момент находится курсор мыши.   -  person iridescent    schedule 23.01.2013
comment
Возможно, вы захотите принять ответ на предыдущий вопрос, который вы связали.   -  person Perception    schedule 23.01.2013
comment
Не используйте getBounds, который имеет слишком низкий уровень и подвержен ошибкам. Почему бы вместо этого не добавить ChangeListener к моделям ваших кнопок и прослушивать наведение (isRollOver() верно)?   -  person Hovercraft Full Of Eels    schedule 23.01.2013
comment
Похоже, вам нужно перевести точку мыши с дочернего компонента на родительский. По сути, я думаю, вам нужно взглянуть на SwingUtilities.convertPoint   -  person MadProgrammer    schedule 23.01.2013
comment
Я изо всех сил старался публиковать только релевантный код. Для SSCCE требуется нечто большее, чем просто релевантный код (как если бы вы могли сказать, что является релевантным, если не считать решения). Код должен быть компилируемым. Я посмотрю, возможно ли дальнейшее сокращение кода В документе, который вы, похоже, проигнорировали, есть несколько предложений. НАПРИМЕР. код в настоящее время имеет дело с 10 Rectangle экземплярами. Попробуйте сделать это с помощью всего 2! Замените сетку 3x3 на 2x2, чтобы получить на 5 меньше того, что требуется. и Т. Д.   -  person Andrew Thompson    schedule 23.01.2013
comment
@HovercraftFullOfEels - О, я попробую ваше предложение. Звучит намного проще.   -  person iridescent    schedule 23.01.2013
comment
@AndrewThompson - Ааа, хорошо, заметил =/ . Плохо.. Сделаю полное чтение документа SSCCE, который вы составили как можно скорее.   -  person iridescent    schedule 23.01.2013
comment
@HovercraftFullOfEels - Хм, я понял, что isRollOver не может знать, на какую именно кнопку он нажал.   -  person iridescent    schedule 23.01.2013
comment
Метод getsource() объекта ChangeEvent слушателя изменений вернет ссылку на модель слушателя. Вы должны быть в состоянии выяснить, как кодировать это.   -  person Hovercraft Full Of Eels    schedule 24.01.2013
comment
Хорошо, спасибо, разобрался, но почему-то getName() работает только после дальнейшего наведения после перетаскивания кусочков изображения на кнопку. Это не работает сразу, когда пользователь перетаскивает части изображения над кнопкой.   -  person iridescent    schedule 24.01.2013