Dúvida com ClipboardOwner > lostOwnership

0 respostas
paolobacci

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();
    }
  }
}
Criado 24 de outubro de 2008
Respostas 0
Participantes 1