Estoy usando la lógica como la siguiente con una interfaz táctil, así que me gustaría ser capaz de utilizar mousePressed para iniciar un arrastre, pero al mismo tiempo ser capaz de utilizar mouseClicked o mouseReleased si el usuario no arrastre.

Sobre mousePressed, tengo un arrastre que se inició. En mouseClicked, quiero que se imprima «mouseClicked», y para imprimir mouseReleased en «mouseReleased», pero por alguna razón el

    dropLabel.getTransferHandler().exportAsDrag(dropLabel, e,
            TransferHandler.COPY);

se traga el evento causante de mouseClicked y mouseReleased eventos no ser despedido, incluso cuando yo no mover el ratón. Observe que comentar la línea que hace que todos los oyentes a ser despedido (pero, obviamente, el arrastre no iniciado).

¿Cómo puedo obtener todos los eventos de ratón a suceder de la manera que yo quiero, específicamente mouseClicked/mouseReleased cuando el usuario no tiene que hacer cualquier arrastrando, mientras que todavía siendo capaz de exportAsDragged si el usuario arrastre? Cualquier hacks/grietas/reflexión soluciones son bienvenidos.

Aquí está el código de ejemplo en el que estoy trabajando con que ilustra mi problema real:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.TransferHandler;
public class DragTest extends JFrame implements MouseMotionListener,
MouseListener {
private JPanel leftPanel = new JPanel(null);
private JPanel rightPanel = new JPanel(null);
JLabel dropLabel;
public DragTest() {
this.setLayout(new GridLayout(1, 2));
leftPanel.setBorder(BorderFactory.createLineBorder(Color.black));
rightPanel.setBorder(BorderFactory.createLineBorder(Color.black));
this.add(leftPanel);
this.add(rightPanel);
leftPanel.addMouseListener(this);
leftPanel.addMouseMotionListener(this);
JTextArea area = new JTextArea();
rightPanel.setLayout(new GridLayout(1, 1));
rightPanel.add(area);
dropLabel = new JLabel("drop");
dropLabel.setTransferHandler(new TransferHandler("text"));
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("mousePressed");
Dimension labelSize = dropLabel.getPreferredSize();
dropLabel.setSize(labelSize);
int x = e.getX() - labelSize.width / 2;
int y = e.getY() - labelSize.height / 2;
dropLabel.setLocation(x, y);
leftPanel.add(dropLabel);
dropLabel.getTransferHandler().exportAsDrag(dropLabel, e,
TransferHandler.COPY);
repaint();
}
@Override
public void mouseDragged(MouseEvent me) {
System.out.println("mouseDragged");
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("mouseClicked");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("mouseReleased");
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
public static void main(String[] args) {
DragTest frame = new DragTest();
frame.setVisible(true);
frame.setSize(600, 400);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
  • Por definición, un evento mouseClicked sólo se producirá en el punto de la mousePresses y mouseReleased es el mismo. Trate de usar mouseReleased lugar. Usted probablemente no debería ser la instalación de una transferencia de controlador en un evento click, sino que debe ser establecida como parte normal de su proceso de inicialización
  • De acuerdo con él, pero mouseReleased no es llamado. He actualizado el código para que coincida con algunos de sus comentarios.
  • Cómo no me la TransferHandler API 😛

1 Comentario

  1. 7

    Lo que realmente necesita el mouseReleased a fuego o qué? Creo que esto debería funcionar bien:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.TransferHandler;
    public class DragTest extends JFrame implements MouseMotionListener,
    MouseListener {
    private JPanel leftPanel = new JPanel(null);
    private JPanel rightPanel = new JPanel(null);
    JLabel dropLabel;
    public DragTest() {
    this.setLayout(new GridLayout(1, 2));
    leftPanel.setBorder(BorderFactory.createLineBorder(Color.black));
    rightPanel.setBorder(BorderFactory.createLineBorder(Color.black));
    this.add(leftPanel);
    this.add(rightPanel);
    leftPanel.addMouseListener(this);
    leftPanel.addMouseMotionListener(this);
    JTextArea area = new JTextArea();
    rightPanel.setLayout(new GridLayout(1, 1));
    rightPanel.add(area);
    dropLabel = new JLabel("drop");
    dropLabel.setTransferHandler(new TransferHandler("text"));
    }
    @Override
    public void mousePressed(MouseEvent e) {
    System.out.println("mousePressed");
    Dimension labelSize = dropLabel.getPreferredSize();
    dropLabel.setSize(labelSize);
    int x = e.getX() - labelSize.width / 2;
    int y = e.getY() - labelSize.height / 2;
    dropLabel.setLocation(x, y);
    leftPanel.add(dropLabel);
    repaint();
    }
    @Override
    public void mouseDragged(MouseEvent me) {
    System.out.println("mouseDragged");
    dropLabel.getTransferHandler().exportAsDrag(dropLabel, me,
    TransferHandler.COPY);
    }
    @Override
    public void mouseMoved(MouseEvent e) {
    }
    @Override
    public void mouseClicked(MouseEvent e) {
    System.out.println("mouseClicked");
    }
    @Override
    public void mouseReleased(MouseEvent e) {
    System.out.println("mouseReleased");
    }
    @Override
    public void mouseEntered(MouseEvent e) {
    }
    @Override
    public void mouseExited(MouseEvent e) {
    }
    public static void main(String[] args) {
    DragTest frame = new DragTest();
    frame.setVisible(true);
    frame.setSize(600, 400);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }

    Me acabo de mudar la convocatoria para iniciar el evento de arrastre en el mouseDragged llamada, de esta manera si usted simplemente haga clic en el ratón, a continuación, todo lo que las llamadas normalmente. Sin embargo, si se arrastra el ratón, que se disparará el arrastrar y soltar llamada, que todavía no bloquear el resto de llamadas, pero de nuevo sólo si se arrastra. Si solo clic, todos los fuegos normalmente.

Dejar respuesta

Please enter your comment!
Please enter your name here