1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| package fvt.myclipboard;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.SwingWorker;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@SuppressWarnings("serial")
public class MyClipBoard extends JFrame implements ListSelectionListener{
public static Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
private final static int TAILLE_MAX = 10;
private DefaultListModel mdl;
private JList list;
public MyClipBoard() {
super("MyClipBoard");
mdl = new DefaultListModel();
list = new JList(mdl);
list.setDragEnabled(true);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setCellRenderer(new MyRenderer());
list.addListSelectionListener(this);
JScrollPane scroll = new JScrollPane(list);
scroll.setPreferredSize(new Dimension(300, (TAILLE_MAX*20)+10));
add(scroll);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
run();
}
private void run() {
new SwingWorker<Void, String>() {
@Override
protected Void doInBackground() {
while(true){
try{
Transferable t = MyClipBoard.clipboard.getContents(null);
if(t.isDataFlavorSupported(DataFlavor.stringFlavor)){
publish((String)t.getTransferData(DataFlavor.stringFlavor));
}
Thread.sleep(1000);
}catch(Exception e){e.printStackTrace();}
}
}
protected void process(List<String> liste) {
for(String s : liste){
addTxt(s);
}
};
}.execute();
}
public void addTxt(String txt){
if(!mdl.contains(txt)){
// Postion le txt en tête de liste
mdl.add(0, txt);
// Supprime le dernier élément si TAILLE_MAX dépassé
if(mdl.size()>TAILLE_MAX){
mdl.remove(TAILLE_MAX);
}
validate();
}
}
// Listeners
@Override
public void valueChanged(ListSelectionEvent arg0) {
try {
// Si la sélection de la list change, on réinjecte la nouvelle dans le presse-papier
if(!list.isSelectionEmpty()){
StringSelection ss = new StringSelection((String)list.getSelectedValue());
clipboard.setContents(ss, null);
}
} catch(IllegalStateException e ) {e.printStackTrace();}
}
// Main
public static void main(String[] args) {
MyClipBoard myclipboard = new MyClipBoard();
myclipboard.setVisible(true);
myclipboard.setAlwaysOnTop(true);
}
}
class MyRenderer implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object source, int index, boolean isselected, boolean hasfocus) {
JLabel label = new JLabel((String)source);
label.setOpaque(true);
label.setPreferredSize(new Dimension(290, 20));
if(index % 2 == 0){
label.setBackground(new Color(0xe0e0e0));
}else{
label.setBackground(new Color(0xf0f0f0));
}
if(isselected){
label.setBackground(new Color(0xaaaaff));
}
return label;
}
} |
Partager