Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

D

7 réponses
Avatar
jp
Bonjour,

Est-ce que quelqu'un sait comment faire pour désactiver Ctrl+C, Ctrl+X et
Ctrl+V dans une JList?

Pour un objet qui hérite de JTextComponent je sais comment faire. Il
suffit de surcharger les méthodes cut(), copy() et paste(). Mais pour une
JList je ne vois pas comment. Y-a-t-il une méthode simple pour y arriver?

Merci d'avance.

7 réponses

Avatar
Olivier Miakinen
Bonjour,
Le 25/03/2018 05:54, jp a écrit :
Est-ce que quelqu'un sait comment faire pour désactiver Ctrl+C, Ctrl+X et
Ctrl+V dans une JList?
Pour un objet qui hérite de JTextComponent je sais comment faire. Il
suffit de surcharger les méthodes cut(), copy() et paste(). Mais pour une
JList je ne vois pas comment. Y-a-t-il une méthode simple pour y arriver?

Je ne suis sûr de rien, mais n'y aurait-il pas moyen de capturer
les saisies au clavier et de filtrer les évènements pour ne pas
les transmettre aux éléments suivants ? Note que si cette méthode
fonctionne il te faudra aussi filtrer Ctrl+Inser et Shift+Inser
pour interdire tout copier coller.
Mais j'ai une petite question annexe : pour quelle raison interdire
cette fonctionnalité ? Ne pas l'avoir est *très* désagréable pour
l'utilisateur.
Merci d'avance.

P.-S. : à moins que tu n'utilises vraiment l'adresse bloiiing.invalid
chez yahoo.com, le .invalid est au mauvais endroit : il faudrait
prendre plutôt ou
si cette adresse n'est pas valide.
--
Olivier Miakinen
Avatar
jp
Le Sun, 25 Mar 2018 22:28:46 +0200, Olivier Miakinen a écrit :
Bonjour,
Le 25/03/2018 05:54, jp a écrit :

Je ne suis sûr de rien, mais n'y aurait-il pas moyen de capturer les
saisies au clavier et de filtrer les évènements pour ne pas les
transmettre aux éléments suivants ? Note que si cette méthode fonctionne
il te faudra aussi filtrer Ctrl+Inser et Shift+Inser pour interdire tout
copier coller.

Oui mais comment?
Mais j'ai une petite question annexe : pour quelle raison interdire
cette fonctionnalité ? Ne pas l'avoir est *très* désagréable pour
l'utilisateur.

Ce ne serait pas dans tout le logiciel. Seulement au niveau de ma JList.
J'ai trouvé ça sur le net:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
//Intercepting Ctrl+v demo
public class TestEditorPane {
private JEditorPane editorPane;
public static class CombinedAction implements ActionListener {
private final ActionListener action1;
private final ActionListener action2;
public CombinedAction(ActionListener action1, ActionListener
action2) {
super();
this.action1 = action1;
this.action2 = action2;
}
@Override
public void actionPerformed(ActionEvent e) {
if (action1 != null) {
action1.actionPerformed(e);
}
if (action2 != null) {
action2.actionPerformed(e);
}
}
}
public TestEditorPane() {
}
private void initUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// JTEXTBOX
editorPane = new JEditorPane();
KeyStroke ctrlV = KeyStroke.getKeyStroke(KeyEvent.VK_V,
KeyEvent.CTRL_DOWN_MASK);
final ActionListener ctrlVAction =
editorPane.getActionForKeyStroke(ctrlV);
editorPane.registerKeyboardAction(new CombinedAction(ctrlVAction,
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("This is my action on CTRL+V");
//Effectivement ça permet une action, mais le Ctrl-V à
//quand-même lieu. Comment le supprimer?
}
}), ctrlV, JComponent.WHEN_FOCUSED);
// JSCROLLPANE
JScrollPane scroll1 = new JScrollPane(editorPane);
scroll1.setHorizontalScrollBarPolicy
(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scroll1.setVerticalScrollBarPolicy
(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
frame.add(scroll1);
frame.setSize(400, 400);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
TestEditorPane test = new TestEditorPane();
test.initUI();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
P.-S. : à moins que tu n'utilises vraiment l'adresse bloiiing.invalid
chez yahoo.com, le .invalid est au mauvais endroit : il faudrait prendre
plutôt ou si cette
adresse n'est pas valide.

Ok. Rectifié.
Avatar
Olivier Miakinen
Le 26/03/2018 06:55, jp m'a répondu :
Je ne suis sûr de rien, mais n'y aurait-il pas moyen de capturer les
saisies au clavier et de filtrer les évènements pour ne pas les
transmettre aux éléments suivants ? Note que si cette méthode fonctionne
il te faudra aussi filtrer Ctrl+Inser et Shift+Inser pour interdire tout
copier coller.

Oui mais comment?
[...]
J'ai trouvé ça sur le net: [...]

Moi j'ai trouvé ça :
http://www.fobec.com/java/992/intercepter-tous-evenements-clavier.html
La fonction dispatchKeyEvent() laisse passer certains évènements clavier
en retournant 'false' (parfois en les ayant transformés, par exemple les
minuscules qui deviennent des majuscules), mais elle *bloque* d'autres
évènements clavier en retournant 'true' (c'est là qu'il faudra tester
les Ctrl+C et autres).
P.-S. : à moins que tu n'utilises vraiment l'adresse bloiiing.invalid
chez yahoo.com, le .invalid est au mauvais endroit : il faudrait prendre
plutôt ou si cette
adresse n'est pas valide.

Ok. Rectifié.

Merci, mais c'est raté. C'est le nom de domaine de *premier* niveau
nommé .invalid qui a été réservé pour les adresses invalides.
Donc ou , mais pas
(parce que là ce serait un nom de domaine
de *second* niveau .invalid.com).
Cordialement,
--
Olivier Miakinen
Avatar
David Larochette
Le 26-03-2018, jp a écrit :
Le Sun, 25 Mar 2018 22:28:46 +0200, Olivier Miakinen a écrit :
Bonjour,
Le 25/03/2018 05:54, jp a écrit :


Je ne suis sûr de rien, mais n'y aurait-il pas moyen de capturer les
saisies au clavier et de filtrer les évènements pour ne pas les
transmettre aux éléments suivants ? Note que si cette méthode fonctionne
il te faudra aussi filtrer Ctrl+Inser et Shift+Inser pour interdire tout
copier coller.

Oui mais comment?
Mais j'ai une petite question annexe : pour quelle raison interdire
cette fonctionnalité ? Ne pas l'avoir est *très* désagréable pour
l'utilisateur.

Ce ne serait pas dans tout le logiciel. Seulement au niveau de ma JList.
J'ai trouvé ça sur le net:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
//Intercepting Ctrl+v demo
public class TestEditorPane {
private JEditorPane editorPane;
public static class CombinedAction implements ActionListener {
private final ActionListener action1;
private final ActionListener action2;
public CombinedAction(ActionListener action1, ActionListener
action2) {
super();
this.action1 = action1;
this.action2 = action2;
}
@Override
public void actionPerformed(ActionEvent e) {
if (action1 != null) {
action1.actionPerformed(e);
}
if (action2 != null) {
action2.actionPerformed(e);
}
}
}
public TestEditorPane() {
}
private void initUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// JTEXTBOX
editorPane = new JEditorPane();
KeyStroke ctrlV = KeyStroke.getKeyStroke(KeyEvent.VK_V,
KeyEvent.CTRL_DOWN_MASK);

// Il y a aussi VK_COPY, VK_CUT et VK_PASTE pour les claviers
// qui possèdent physiquement ces touches.
final ActionListener ctrlVAction =
editorPane.getActionForKeyStroke(ctrlV);
editorPane.registerKeyboardAction(new CombinedAction(ctrlVAction,
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("This is my action on CTRL+V");
//Effectivement ça permet une action, mais le Ctrl-V à

e.consume(); // Et l'objet qui a émis l'évènement
// l'ignorera
}
}), ctrlV, JComponent.WHEN_FOCUSED);
// JSCROLLPANE
JScrollPane scroll1 = new JScrollPane(editorPane);
scroll1.setHorizontalScrollBarPolicy
(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scroll1.setVerticalScrollBarPolicy
(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
frame.add(scroll1);
frame.setSize(400, 400);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
TestEditorPane test = new TestEditorPane();
test.initUI();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
P.-S. : à moins que tu n'utilises vraiment l'adresse bloiiing.invalid
chez yahoo.com, le .invalid est au mauvais endroit : il faudrait prendre
plutôt ou si cette
adresse n'est pas valide.

Ok. Rectifié.
Avatar
jp
Le Mon, 26 Mar 2018 21:22:29 +0000, David Larochette a écrit :
e.consume(); // Et l'objet qui a émis l'évènement
// l'ignorera

La méthode consume est protected. Comment faire pour l'utiliser dans une
méthode public, car elle n'est pas visible...
Merci de m'avoir répondu.
Avatar
jp
Le Mon, 26 Mar 2018 14:44:16 +0200, Olivier Miakinen a écrit :
Moi j'ai trouvé ça :
http://www.fobec.com/java/992/intercepter-tous-evenements-clavier.html
La fonction dispatchKeyEvent() laisse passer certains évènements clavier
en retournant 'false' (parfois en les ayant transformés, par exemple les
minuscules qui deviennent des majuscules), mais elle *bloque* d'autres
évènements clavier en retournant 'true' (c'est là qu'il faudra tester
les Ctrl+C et autres).

Je regarde ça...
Merci, mais c'est raté. C'est le nom de domaine de *premier* niveau
nommé .invalid qui a été réservé pour les adresses invalides.
Donc ou , mais pas
(parce que là ce serait un nom de domaine de
*second* niveau .invalid.com).

Ce coup-ci c'est bon. Je ne savais pas que c'était une norme. Je pensais
que c'était un usage non codifié...
Merci.
Avatar
David Larochette
Le 27-03-2018, jp a écrit :
Le Mon, 26 Mar 2018 21:22:29 +0000, David Larochette a écrit :
e.consume(); // Et l'objet qui a émis l'évènement
// l'ignorera

La méthode consume est protected. Comment faire pour l'utiliser dans une
méthode public, car elle n'est pas visible...

<https://docs.oracle.com/javase/9/docs/api/java/awt/event/InputEvent.html#consume-->
Je la vois toujours en public.