D

Le
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.
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #26469212
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
jp
Le #26469239
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é.
Olivier Miakinen
Le #26469310
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
David Larochette
Le #26469412
Le 26-03-2018, 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);

// 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é.
jp
Le #26469492
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.
jp
Le #26469491
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.
David Larochette
Le #26469598
Le 27-03-2018, 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...

Je la vois toujours en public.
Publicité
Poster une réponse
Anonyme