Domanda Problemi gestione clipboard

Stato
Discussione chiusa ad ulteriori risposte.

Sevenjeak

Utente Gold
23 Settembre 2010
333
58
26
202
Ultima modifica:
Su un mio programma scritto in java, sto gestendo la ClipBoard di sistema, ma quest'ultimo mi da problemi, nel codice del mio programma la funzione taglia mi funziona, ma incolla mi da problemi, nel senso che, non so perchè, ma mi incolla quello che ho tagliato precedentemente con comando taglia, cosa strana, visto che, nella clipboard di sistema, da quello che ho visto c'è quello che ho tagliato.

La mia domanda è: come mai mi incolla il testo precedentemente tagliato? ma soprattutto, da dove lo prende? visto che negli appunti c'è il testo tagliato attualmente?

Oltre a queste domande, ho riprovato, in un progetto separato, a gestire solamente la clipboard di sistema, il codice del file è questo:

Codice:
[FONT=tahoma][SIZE=2]import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;


import javax.swing.*;


class JP extends JFrame implements ActionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public Toolkit systemToolkit = Toolkit.getDefaultToolkit();
    public Clipboard ClipBoard = systemToolkit.getSystemClipboard();
    public Transferable clipboardContents = ClipBoard.getContents(null);
    public TransferHandler handler = null;

    public JTextArea jtextarea = null;

    public JP() {
        setSize(1000, 1000);
        setLayout(new GridLayout(2,1));
        setVisible(true);

        JButton jbutton = new JButton("Cut");
        jbutton.addActionListener(this);

        JButton jbutton1 = new JButton("Copy");

        JButton jbutton2 = new JButton("Paste");

        JPanel first = new JPanel(new FlowLayout());

        first.add(jbutton);
        first.add(jbutton1);
        first.add(jbutton2);

        add(first);

        jtextarea = new JTextArea();

        add(jtextarea);
    }

    public void actionPerformed(ActionEvent evt) {
        String cmd = evt.getActionCommand();

        if (cmd.equals("Cut")) {
            try {
              handler = jtextarea.getTransferHandler();
                handler.exportToClipboard(jtextarea, ClipBoard, TransferHandler.MOVE);
            }catch (Exception ex) {
                ex.printStackTrace();
            }
        }else if(cmd.equals("Copy")) {
             try {
                handler = jtextarea.getTransferHandler();
                 handler.exportToClipboard(jtextarea, ClipBoard, TransferHandler.COPY);
             }catch (Exception ex) {
                 ex.printStackTrace();
             }
          }else if(cmd.equals("Paste")) {
             try {                
                 if (clipboardContents != null && clipboardContents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                     handler = jtextarea.getTransferHandler();
                     handler.importData(jtextarea, clipboardContents);
                 }
             }catch (Exception ex) {
                 ex.printStackTrace();
             }
        }
    }
}


public class cpManager {
    public static void main(String[] args) {
        new JP();
    }
}[/SIZE][/FONT]

Ma a quando pare, credo di aver sbagliato qualcosa, ma mi da più problemi di prima, ovvero, ora mi funziona solo il pulsante taglia, come posso risolvere?
 
Su un mio programma scritto in java, sto gestendo la ClipBoard di sistema, ma quest'ultimo mi da problemi, nel codice del mio programma la funzione taglia mi funziona, ma incolla mi da problemi, nel senso che, non so perchè, ma mi incolla quello che ho tagliato precedentemente con comando taglia, cosa strana, visto che, nella clipboard di sistema, da quello che ho visto c'è quello che ho tagliato.

La mia domanda è: come mai mi incolla il testo precedentemente tagliato? ma soprattutto, da dove lo prende? visto che negli appunti c'è il testo tagliato attualmente?


Non avendo a disposizione il codice non saprei dirti, comunque ti posto il tuo codice d'esempio opportunamente fixxato:
Codice:
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;


import javax.swing.*;


class JP extends JFrame implements ActionListener {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    public Toolkit systemToolkit = Toolkit.getDefaultToolkit();
    public Clipboard ClipBoard = systemToolkit.getSystemClipboard();
    public Transferable clipboardContents = ClipBoard.getContents(null);
    public TransferHandler handler = null;

    public JTextArea jtextarea = null;

    public JP() {
        setSize(1000, 1000);
        setLayout(new GridLayout(2,1));
        setVisible(true);

        JButton jbutton = new JButton("Cut");
        jbutton.addActionListener(this);

        JButton jbutton1 = new JButton("Copy");
        jbutton1.addActionListener(this);    // <--- (DIMENTICANZA)

        JButton jbutton2 = new JButton("Paste");
        jbutton2.addActionListener(this);    // <--- (DIMENTICANZA)

        JPanel first = new JPanel(new FlowLayout());

        first.add(jbutton);
        first.add(jbutton1);
        first.add(jbutton2);

        add(first);

        jtextarea = new JTextArea();

        add(jtextarea);
    }

    public void actionPerformed(ActionEvent evt) {
        String cmd = evt.getActionCommand();

        if (cmd.equals("Cut")) {
            try {
              handler = jtextarea.getTransferHandler();
                handler.exportToClipboard(jtextarea, ClipBoard, TransferHandler.MOVE);
            }catch (Exception ex) {
                ex.printStackTrace();
            }
        }else if(cmd.equals("Copy")) { // funzionava, solo che non avevi aggiunto il listener (testato con ctrl+v)
             try {
                handler = jtextarea.getTransferHandler();
                 handler.exportToClipboard(jtextarea, ClipBoard, TransferHandler.COPY);
             }catch (Exception ex) {
                 ex.printStackTrace();
             }
          }else if(cmd.equals("Paste")) {
             try {
                 clipboardContents = ClipBoard.getContents(ClipBoard); // prima devi prelevare il contenuto della clipboard (POSSIBILE ERRORE)
                 if (clipboardContents != null && clipboardContents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                     handler = jtextarea.getTransferHandler();
                     handler.importData(jtextarea, clipboardContents);

                 }
             }catch (Exception ex) {
                 ex.printStackTrace();
             }
        }
    }
}


public class cpManager {
    public static void main(String[] args) {
        new JP();
    }
}

Assicurati che nel tuo codice hai messo la riga che ti ho segnalato con "possible errore".

 
Ok grazie.

Il problema principale, quello che avevo nell'altro mio progetto è stato risolto aggiungendo l'ultima riga da te commentata, i problemi dei pulsanti era solamente una dimendicanza, visto che ho riprovato è riprovato a riscrivere più volte il codice.

L'unica cosa che non riesco a capire è il perché, il codice, se evito di scrivere l'ultima riga da te inserita mi incolla un testo differente da quello che ho tagliato, come mai? mi sembra strano questo, da dove lo prende il testo che mi incolla? me lo sapresti spiegare?
 
Ok grazie.

Il problema principale, quello che avevo nell'altro mio progetto è stato risolto aggiungendo l'ultima riga da te commentata, i problemi dei pulsanti era solamente una dimendicanza, visto che ho riprovato è riprovato a riscrivere più volte il codice.

L'unica cosa che non riesco a capire è il perché, il codice, se evito di scrivere l'ultima riga da te inserita mi incolla un testo differente da quello che ho tagliato, come mai? mi sembra strano questo, da dove lo prende il testo che mi incolla? me lo sapresti spiegare?

Il testo che ti incolla lo prende dalla variabile clipboardContents (sempre che nel tuo programma si chiami allo stesso modo), o più generalmente diciamo che lo prende dal secondo parametro che passi a handler.importData(...); idealmente dovresti aggiornare il valore di quella variabile appena prima di incollare qualcosa (esattamente come hai visto nel mio esempio).
Probabilmente tu avevi il clipboardContents = qualcosa; da qualche altra parte del codice (es. solo nella funzione Cut o solo nella funzione Copy) e quindi ti aggiorna il valore solo in determinate situazioni.

PS.
La mia è solo un'ipotesi, non conoscendo il codice non posso capire dov'è realmente il problema.
 
Veramente io pensavo, ovvio che mi sbagliavo, che con handler.importData(...), aggiornava il contenuto del clipboardContent in automatico.

Ok.. cmq ho capito, grazie.
 
Stato
Discussione chiusa ad ulteriori risposte.