# Text in die Zwischenablage schreiben



## henning-malaysia (9. Mai 2005)

Liebe Leuts, 

ich würde gerne einen simplen Textstring in die Zwischenablage kopieren, und zwar ohne, dass der Benutzer Strg+C drücken muss, sondern auf Knopfdruck. 

Ich habe herausgefunden, dass ich mit Toolkit.getDefaultToolkit().getSystemClipboard() an die Zwischenablage komme, und da gibt es auch eine Methode setContents(), aber der muss ich irgendso ein komisches Transferable-Objekt übergeben, wobei mir nicht ganz klar ist, was das denn eigentlich sein soll.

Egal, ich habe eine Klasse geschrieben, die "Transferable" implementiert, deren Methode getTransferData() gibt den String zurück, der in die Zwischenablage soll. Dieses, Transferable-Objekt übergebe ich also der setContents-Methode, und es passiert - nichts! Sprich, wenn ich danach Strg+V drücke, erscheint nicht der Text, den die getTransferData()-Methode  zurückgegeben hat. 

Das Problem könnte daran liegen, dass ich als zweiten Parameter für die setContents()-Methode ein ClipboardOwner-Objekt übergeben sollte, da ich aber der Ansicht war, das nicht zu brauchen, habe ich mal einfach "null"  übergeben. Liegt darin das Problem?

Oder anders gefragt: Gibt es vielleicht eine simplere Möglichkeit, einfach nur einen String in die Zwischenablage zu kopieren, sodass er danach bei  Strg+V erscheint? Wenn's nich t anders geht, von mir aus auch plattformabhängig. 

Danke schonmal und freundliche Grüße

henning-malaysia


----------



## Thomas Darimont (9. Mai 2005)

Hallo!

Schau mal hier:

```
/*
 * Created on 09.05.2005@10:20:32 by Darimont
 *
 * TODO Licence info
 */
package de.tutorials.patterns.decorator;

import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

/**
 * @author Darimont
 * 
 * TODO Explain me
 */
public class ClipboardExample extends JFrame {

	JTextField jtf;

	JButton btn;

	public ClipboardExample() {
		super("ClipboardExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		jtf = new JTextField(20);
		btn = new JButton("copy text to clipboard");
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
						new StringSelection(jtf.getText()), null);
			}
		});

		add(jtf, BorderLayout.CENTER);
		add(btn, BorderLayout.SOUTH);

		pack();
		
		setVisible(true);
	}

	public static void main(String[] args) {
		new ClipboardExample();
	}
}
```

Gruß Tom


----------



## henning-malaysia (10. Mai 2005)

Danke Tom!

Dieses StringSelection-Objekt war der entscheidende Tipp. Sowas in der Art hatte ich erhofft.


----------



## Ades (5. Oktober 2010)

Dieser Beitrag ist zwar sehr alt, 
kann aber torztdem jemand sagen, wie man eine Tabelle kopieren  kann?

Also statt ein JTextField hätte man da einen JTable und einen JButton mit einem ActionListener dahinter, dass kopoieren soll...

Hat da jemand eine Antwort drauf****?


----------



## Maddin (5. Oktober 2010)

Hallo,

Willst du den Text einer Zelle kopieren?

Wenn ja, hol dir doch einfach mit getValueAt(row, column) den Inhalt der Zelle und verfahr so wie oben beschrieben...
Also:

```
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
                        new StringSelection((String) table.getValueAt(row, column)), null);
```


----------



## Ades (7. Oktober 2010)

Hallo Maddin,

nein eigentlich möchte ich die ganze Tabelle kopieren... 
Ich versuche mich gerade in Swing und AWT einzuarbeiten und mache einige Übungen, da bin ich auf die Idee gekommen auch einen JButton zu erstellen wo ich mein Ergebnis, also meine Tabelle kopieren lässt.

Vielen Dank aber für deine Info, das was du mir geschrieben hast habe ich eben ausprobiert, es funktioniert super... 
Nur wollte ich wissen, ob man auch eine ganze Tabelle kopieren kann und nicht nur eine bestimmte zeile davon?  :-( oder geht sowas garnicht...

Wie geschrieben der kopiert mir jetzt nur eine bestimmte Zeile die ich ihm über row und column übergebe...
Kannst du mir da auch vielleicht einen Tipp geben?


----------



## Ades (7. Oktober 2010)

Also hier ist mein ActionListener für meinen JButton der kopieren soll:


static ActionListener kopieren = new ActionListener(){
			public void actionPerformed(ActionEvent em){

				Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
						new StringSelection(table), null);

			}
		};

klar bei "table" macht er probleme! Es wird ein String erwartet, deshalb kann ich meine Tabelle nicht übergeben :-(

Gibt es da nicht etwas anderes statt new StringSelection(), was auch Object´s übernehmen kann?


----------



## Maddin (7. Oktober 2010)

Hm ich hab auch nur den Code von Thomas etwas abgeändert...
Es wäre natürlich möglich, einfach den kompletten Inhalt der Tabelle zu kopieren, aber ich denke, du willst die Struktur bzw. Spalten/Zeilen/Trennlinien etc. beibehalten?

Ich kann mir auch wenig vorstellen, dass man etwas anderes in die Zwischenablage kopieren kann als Strings... Klar, es geht in Words, aber dann muss die Tabelle oder was immer man kopiert, (für gewöhnlich) auch wieder in ein Word-Dokument eingefügt werden, damit eine Tabelle rauskommt.

Willst du wirklich den kompletten Inhalt ohne Struktur in die Zwischenablage kopieren, dann kannst du einfach die JTable durchlaufen und jeden Zelleninhalt zu einem String addieren, den du dann der StringSelection übergibst.

Gruß,
Martin


----------



## Thomas Darimont (7. Oktober 2010)

Hallo,

schau mal hier:

```
package de.tutorials.training;

import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class JTableClipboardExample extends JFrame {

  JTable table;
  JButton btnCopy;

  ActionListener copyTableDataToClipBoard = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
      TableModel model = table.getModel();
      StringBuilder s = new StringBuilder();

      for (int r = -1; r < model.getRowCount(); r++) {

        for (int c = 0; c < model.getColumnCount(); c++) {
          String columnName = model.getColumnName(c);
          if (r == -1) {
            s.append(columnName);
          } else {
            s.append(model.getValueAt(r, c));
          }
          s.append("\t");
        }

        s.append("\n");
      }

      StringSelection transferable = new StringSelection(s.toString());
      Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, transferable);
    }
  };


  public JTableClipboardExample() {
    super("JTableClipboardExample");
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    Object[][] rowData = new Object[][] { { "a1", "b1", "c1" }, { "a2", "b2", "c2" }, { "a3", "b3", "c3" } };
    Object[] columnNames = new Object[] { "a", "b", "c" };
    table = new JTable(new DefaultTableModel(rowData, columnNames));
    btnCopy = new JButton("copy to clipboard as csv");
    btnCopy.addActionListener(copyTableDataToClipBoard);
    add(new JScrollPane(table), BorderLayout.CENTER);
    add(btnCopy, BorderLayout.SOUTH);

    pack();
    setVisible(true);
  }


  public static void main(String[] args) {
    new JTableClipboardExample();
  }
}
```

Wenn du mit klick auf den Button den Inhalt der Tabelle in die Zwischenablage kopierst und anschließend in Excel den Inhalt der Zwischenablage wieder rauskopierst siehst du die Daten aus deiner JTable.

Gruß Tom


----------



## Ades (8. Oktober 2010)

Hey jungs es funktioniert 
Super,  so schnell und einfach gelöst, Danke Tom
dein Programm ist sehr gut geschrieben.   
Gruß Ades


----------

