Je semble avoir un problème avec JTextPane. J'ai étendu JTextPane pour rendre une image flottante parce que la fonctionnalité de l'icône JTextPane ne correspond pas à mon objectif. Je souhaite que l'utilisateur puisse cliquer sur l'image et que certains événements soient exécutés. Cependant, lorsque je clique sur l'image, même lorsque j'utilise evt.consume(), le curseur et la sélection sont mis à jour dans le JTextPane. Je souhaite généralement que les clics et les événements de la souris interagissent avec l'image pour ne pas affecter la position du curseur ou la sélection. Code pertinent:À l'aide d'un JTextPane, les événements de souris consommés continuent de se propager aux mises à jour/mises à jour de mise en garde/insertion
public class JTextPaneImg extends JTextPane {
public JTextPaneImg(){
super();
addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
formMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
formMouseReleased(evt);
}
});
}
private void formMousePressed(java.awt.event.MouseEvent evt) {
if (imgBound.contains(evt.getPoint())) {
evt.consume();
//Do some stuff in here to interact with the image
// but the event still undesirably interacts with selection/caret
}
}
private void formMouseReleased(java.awt.event.MouseEvent evt) {
if (imgBound.contains(evt.getPoint())) {
evt.consume();
//Do some stuff in here to interact with the image
// but the event still undesirably interacts with selection/caret
}
}
}
J'ai même appelé getMouseListeners et vérifié que mon écouteur de souris est le dernier dans le tableau, je lis que les auditeurs sont appelés du plus haut au plus bas indice, ce qui signifie que mes appels d'auditeurs consomment, il devrait être le dernier à agir sur l'événement. Pourquoi est-ce que mon événement de clic de souris met toujours à jour le curseur alors? Est-ce un problème avec le Look and Feel?
Je pense que je peux avoir trouvé un indice, le caret pour JTextPane est par défaut le BasicCaret de BasicTextUI, qui est essentiellement une copie exacte de DefaultCaret. La méthode de mise à jour DefaultCaret est la suivante: protected void moveCaret (MouseEvent e) { \t Point pt = nouveau Point (e.getX(), e.getY()); \t Position.Bias [] biasRet = nouvelle position.Bias [1]; \t int pos = composant.getUI(). ViewToModel (composant, pt, biasRet); \t if (biasRet [0] == nul) \t biasRet [0] = Position.Bias.Forward; \t si (pos> = 0) { \t moveDot (pos, biasRet [0]); \t} } Notez le manque de if (! E.isConsumed) –