Компонент больше не получает событие мыши после того, как он был повторно добавлен в родительский компонент в Java 8.

В основном у меня есть класс Task, расширяющий JComponent, каждая задача может перекрывать друг друга. Когда я нажимаю мышью на одну задачу, ее можно вывести на передний план, если она перекрывается другими задачами. Затем я могу перетащить задачу в другое место. Он отлично работал в Java 7, но не работал в Java 8. Все последующие события, такие как перетаскивание мыши и отпускание мыши после нажатия мыши, не будут запускаться в Java 8.

// Task.java

public class Task extends JComponent{
    String _text;
    public Task(String text){
        _text = text;
        new TaskListener(this);
    }
}


// TaskListener.java

import java.awt.Container;
import java.awt.event.MouseEvent;
import javax.swing.event.MouseInputAdapter;

public class TaskListener extends MouseInputAdapter {

    private Task _task;

    public TaskListener(Task task){
        _task = task;
        _task.addMouseListener(this);
        _task.addMouseMotionListener(this);
    }  

    public void mouseDragged(MouseEvent e) {
        System.out.println("mouse dragged");
    }

    public void mouseClicked(MouseEvent e) {
        System.out.println("mouse clicked");
    }

    public void mouseEntered(MouseEvent e) {
        System.out.println("mouse entered");
    }

    public void mouseExited(MouseEvent e) {
        System.out.println("mouse exited");
    }

    public void mouseMoved(MouseEvent e) {
        System.out.println("mouse moved");
    }

    public void mousePressed(MouseEvent e) {
        System.out.println("mouse pressed");
        // to get task to front in case it is overlapped by other tasks
        // which will prevent follow up events from firing out in Java 8
        Container parent = _task.getParent();
        parent.remove(_task);
        parent.add(_task, 0);
        _task.repaint(); 
    }

    public void mouseReleased(MouseEvent e) {
        System.out.println("mouse released");
    }
}

Заранее спасибо.


person Jerry    schedule 16.01.2015    source источник


Ответы (1)


вместо повторного добавления задачи я использую parent.setComponentZOrder(_task, 0), чтобы изменить z-порядок задачи, чтобы сделать ее на передний план.

person Jerry    schedule 19.01.2015