2015-09-21 3 views
2

Я пытаюсь сделать что-то похожее на это: Swing - Get new component under mouseReleasedПолучить компонент под mouseReleased

В окне, у меня есть несколько кнопок с номером на каждом из них. Например, 2 8 5 6. Это означало бы 4 JButtons. Если я нажимаю мышь на 2, перетащить и отпустить на 8 ... Я хотел бы firstcomponent содержать JButton 2 и lastcomponent содержать JButton с 8

public class Bouton extends JButton implements MouseListener { 

String name; 
Component firstEntered; 
Component lastEntered; 

public Bouton(String str) { 
    super(str); 
    this.name = str; 
    this.addMouseListener(this); 
} 

@Override 
public void mouseClicked(MouseEvent event) { } 

@Override 
public void mouseEntered(MouseEvent event) { 
    lastEntered = event.getComponent(); 
    String name2 = ((JButton) lastEntered).getName(); 
    System.out.println("entered : " + name2); 
} 

@Override 
public void mouseExited(MouseEvent event) { 
    firstEntered = event.getComponent(); 
} 

@Override 
public void mousePressed(MouseEvent event) { 
    // I tried this didn't work... 
    //firstEntered = event.getComponent(); 
} 


@Override 
public void mouseReleased(MouseEvent event) { 
    firstEntered.setBackground(Color.RED); 
    lastEntered.setBackground(Color.BLUE); 

    String name = ((JButton) firstEntered).getName(); 
    String name2 = ((JButton) lastEntered).getName(); 
    System.out.println("Release ... first: " + name); 
    System.out.println("Release ... last entered: " + name2); 
}  

@Override 
public String getName() { 
    return name; 
} 

} 

Выход есть:

entered : 2 
entered : 8 
Release ... first: 2 
Release ... last entered: 2 

Моя проблема заключается в том, что я не понимаю, почему «Выпуск ... последний введен: 2» показывает 2. Почему это не 8?

Благодаря

ответ

1

Каждый Bouton добавить имеет свою собственную firstEntered и lastEntered, поэтому он может только правильно распечатать текущей кнопки (this). Мое предложение было бы создать только один новый экземпляр MouseListener, я не думаю, что есть необходимость сделать собственный JButton: (Метод mousePressed() также теперь работает правильно)

import java.awt.Color; 
import java.awt.Component; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Example { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 

     JPanel p = new JPanel(); 

     MyMouseListener ml = new MyMouseListener(); // Only one MouseListener 
     for (int i = 0; i < 8; i++) { 
      JButton b = new JButton(String.valueOf(i)); 
      b.addMouseListener(ml); // Add the same MouseListener to every 
            // button 
      p.add(b); 
     } 
     frame.setContentPane(p); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500, 500); 
     frame.setVisible(true); 

    } 

    public static class MyMouseListener implements MouseListener { 

     Component firstEntered; 
     Component lastEntered; 

     @Override 
     public void mouseClicked(MouseEvent event) { 

     } 

     @Override 
     public void mouseEntered(MouseEvent event) { 
      lastEntered = event.getComponent(); 
      System.out.println("entered : " + ((JButton) lastEntered).getText()); 
     } 

     @Override 
     public void mouseExited(MouseEvent event) { 

     } 

     @Override 
     public void mousePressed(MouseEvent event) { 
      firstEntered = event.getComponent(); 
      System.out.println("pressed : " + ((JButton) event.getComponent()).getText()); 
     } 

     @Override 
     public void mouseReleased(MouseEvent event) { 
      firstEntered.setBackground(Color.RED); 
      lastEntered.setBackground(Color.BLUE); 

      System.out.println("Release ... first: " + ((JButton) firstEntered).getText()); 
      System.out.println("Release ... last entered: " + ((JButton) lastEntered).getText()); 
     } 
    } 

}