Olá, Não sei se a dúvida é avancada ou básica e tentei aqui.
Mas estou fazendo um projetinho pessoal simples.
Ele captura toda string que eu copio do clipboard e coloca no meu menuzinho um maximo de 5 delas e vai substituindo conforme for aparecendo mais strings.
Mas eu nao estou conseguindo copiar 2 strings "da mesma janela", por exemplo:
Abro meu programinha, copio uma string URL do firefox e tento copiar uma outra string do firefox sem fazer ele perder o foco, a outra string nao eh copiada.
Mas se eu copiar uma URL do firefox, ir para o msn e copiar um texto la e voltar ao firefox para copiar uma 3a string. As 3 sao copiadas certinhas para meu programa.
Resumindo: não consigo copiar 2 strings consecutivas de um mesmo programa.
Isso me parece um problema do lostOwnership que nao sei como proceder, correto?
Irei postar meu codigo para vcs brincarem.
package client.logic.clipboard;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import client.desktop.trayIcon.TrayIconConstructor;
/**
*
*
* @author paolo
*/
public class TextTransfer implements ClipboardOwner {
/**
*
*/
String result = "";
/**
*
*/
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
/**
* construtor
*/
public TextTransfer() {
this.clipboard.addFlavorListener(new FlavorListener() {
@Override
public void flavorsChanged(FlavorEvent e) {
String s = getClipboardContents();
TrayIconConstructor.addItem(s);
}
});
}
/**
* Empty implementation of the ClipboardOwner interface.
*
* @param aClipboard
* @param aContents
*/
public void lostOwnership(Clipboard aClipboard, Transferable aContents) {
}
/**
* Place a String on the clipboard, and make this class the owner of the
* Clipboard's contents.
*
* @param aString
*/
public void setClipboardContents(String aString) {
this.clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection stringSelection = new StringSelection(aString);
this.clipboard.setContents(stringSelection, null);
}
/**
* Get the String residing on the clipboard.
*
* @return any text found on the Clipboard; if none found, return an empty
* String.
*/
public String getClipboardContents() {
this.clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//odd: the Object param of getContents is not currently used
Transferable contents = this.clipboard.getContents(null);
boolean hasTransferableText =
(contents != null)
&& contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
this.result =
(String) contents.getTransferData(DataFlavor.stringFlavor);
}
catch (Exception ex) {
//highly unlikely since we are using a standard DataFlavor
System.out.println(ex);
ex.printStackTrace();
}
}
return this.result;
}
}
package client.desktop.trayIcon;
import java.awt.Image;
import java.awt.List;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import client.logic.clipboard.TextTransfer;
/**
*
*
* @author paolo
*/
public class TrayIconConstructor {
/**
*
*/
static TextTransfer text = new TextTransfer();
/**
*
*/
private final static int MAX_SLOTS = 5;
/**
* popupmenu mostrado no trayicon
*/
private JPopupMenu popupMenu;
/**
* trayicon do sistema
*/
private TrayIcon trayIcon;
/**
* menu que tem items copiados
*/
private static JMenu items;
/**
* @return popupMenu
*/
public JPopupMenu getPopupMenu() {
return this.popupMenu;
}
/**
* @return trayIcon
*/
public TrayIcon getTrayIcon() {
return trayIcon;
}
/**
* construtor
*/
public TrayIconConstructor() {
this.popupMenu = new JPopupMenu();
Image img =
Toolkit.getDefaultToolkit().getImage("client/desktop/img/java.gif");
this.trayIcon = new TrayIcon(img, "5PTray", null);
createPopUpMenu(popupMenu);
this.trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (!e.isPopupTrigger() && e.getButton() == MouseEvent.BUTTON3) {
popupMenu.setVisible(false);
popupMenu.setLocation(e.getX(), e.getY());
popupMenu.setInvoker(popupMenu);
popupMenu.setVisible(true);
}
else {
popupMenu.setVisible(false);
}
}
});
}
/**
* @param popupMenu
*/
private void createPopUpMenu(JPopupMenu popupMenu) {
this.popupMenu = popupMenu;
JMenuItem exit = new JMenuItem("Exit");
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(null, "Confirm Quit?",
"Quit Message", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
System.exit(0);
}
});
items = new JMenu("Items");
this.popupMenu.add(items);
items.setEnabled(false);
this.popupMenu.addSeparator();
this.popupMenu.add(exit);
this.popupMenu.setLightWeightPopupEnabled(true);
}
/**
* @param o
* @return boolean
*/
public static boolean addItem(Object o) {
final String stringToAdd;
try {
stringToAdd = (String) o;
}
catch (Exception e) {
return false;
}
if (checkIfExists(stringToAdd)) {
return false;
}
items.setEnabled(true);
if (items.getItemCount() < MAX_SLOTS) {
JMenuItem act = items.add(stringToAdd);
act.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
text.setClipboardContents(stringToAdd);
}
});
return true;
}
else {
List list = new List(5, false);
for (int i = 0; i < MAX_SLOTS; i++) {
list.add(items.getItem(i).getText());
}
list.add(stringToAdd, 0);
items.removeAll();
for (int i = 0; i < MAX_SLOTS; i++) {
final String d = list.getItem(i);
JMenuItem act = items.add(list.getItem(i));
act.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
text.setClipboardContents(d);
}
});
}
return true;
}
}
/**
* @param o
* @return boolean
*/
private static boolean checkIfExists(Object o) {
List list = new List(5, false);
String toCheck = (String) o;
for (int i = 0; i < items.getItemCount(); i++) {
list.add(items.getItem(i).getText());
}
for (int i = 0; i < items.getItemCount(); i++) {
System.out.println(toCheck + "\n" + list.getItem(i));
if (toCheck.equalsIgnoreCase(list.getItem(i)))
return true;
}
return false;
}
}
package client.main;
import java.awt.AWTException;
import java.awt.SystemTray;
import client.desktop.trayIcon.TrayIconConstructor;
/**
*
*
* @author paolo
*/
public class main {
/**
* @param args
*/
public static void main(String args[]) {
TrayIconConstructor init = new TrayIconConstructor();
SystemTray tray = SystemTray.getSystemTray();
try {
tray.add(init.getTrayIcon());
}
catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}