Copy&Paste-Funktionalität in der MenuBar / Toolbar?

DuenenTuessy

Grünschnabel
Hallo,

ich habe eine Swing-Oberfläche mit einigen Textboxen und -areas. Vorhandenen Text kann ich daraus mit Strg+C kopieren und auch Text aus der Zwischenablage mit Strg+V reinkopieren.
Nun möchte ich aber auch die Möglichkeit haben, in der MenuBar über Bearbeiten->Kopieren, bzw. in der Toolbar auf den Kopieren-Button, den markierten Text zu kopieren oder welchen einzufügen.
Gibt es dafür vom System oä eine Funktion, die dies handelt? Möchte nämlich nicht die Clipboard-Verwaltung selber nachprogrammieren müssen.

Vielen Dank!
 
Das ist nicht genau das, was ich meine.
Dafür müsste ich ja immer noch wissen, welche Textkomponente vor dem Klick ins Menü/auf den Button, markiert war. Jedoch geht beim Klick der Fokus ja verloren. Daher fällt mri da einfach keine Lösung ein. Oder stehe ich einfach nur auf dem Schlauch?
 
Hallo,

mir fällt spontan folgendes ein: Du könntest eine Variable von Typ JTextField definieren. Per Focuslistener speicherst du in diesem immer das aktuelle Textfeld. Wenn du nun den Copy-Button betätigst kannst du über diese Variable dann das letzte Textfeld bestimmen.


Ja ich glaube ich habe eine noch bessere Idee: Jede JComponent'e hat besitzt die Methode setFocusable(). Wenn du nun die jeweiligen Buttons mit setFocusable(false) modifizierst, wird der Fokus auf dem Textfeld bleiben wenn du auf einen Button drückst.


Vg Erdal
 
Vielen Dank! Ich glaube das hilft mir weiter!
Das müsste genau das sein was ich gesucht habe!
Ich werde es direkt ausprobieren.
 
Irgendwie scheiter ich gerade an der Umsetzung.
Ich benötige ja die Komponente die den Fokus hat, aber weiß gerade nicht wie ich an diese Komponente komme, ohne dass ich mir global diejenige Komponente speichere die aktuell den Fokus hat?
Geht das irgendwie ohne viel Aufwand? Ich möchte nicht soviele globale Variablen und Listener haben und diese immer übergeben müssen...

Vg Nicole
 
Hallo Nicole,

hier mal ein einfaches Beispiel:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class CopyAndPaste extends JFrame implements ActionListener {

	private JButton b1 = new JButton("Copy");

	private JButton b2 = new JButton("Paste");

	public CopyAndPaste() {
		this.setTitle(this.getClass().getCanonicalName());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		this.setLayout(new GridLayout(4, 2));
		this.add(b1);
		this.add(b2);
		for (int i = 0; i < 6; i++) {
			this.add(new JTextField(15));
		}

		b1.addActionListener(this);
		b2.addActionListener(this);

		b1.setFocusable(false);
		b2.setFocusable(false);

		this.pack();
		this.setVisible(true);
	}

	public void copy() {
		JTextField tf = (JTextField) this.getFocusOwner();
		tf.copy();
	}

	public void paste() {
		JTextField tf = (JTextField) this.getFocusOwner();
		tf.paste();
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == b1)
			copy();
		else
			paste();
	}

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


Vg Erdal
 
Hmm Danke. Soweit hatte ich das schon verstanden. Vielleicht habe ich mich etwas falsch ausgedrückt.
Ich habe eine Klasse MainFrame von meinem Hauptfenster und eine Klasse MyToolbar und in der Toolbar steht dann die actionPerformed für z.B. den Copy-Button, aber dort weiß ich jetzt nicht wie an meinem MainFrame komme um diesen zu fragen welches den "Fokus" hat...

Ist das schlecht konzipiert oder übersehe ich was?

Von MyToolbar wird im MainFrame ein Objekt erzeugt und dem MainFrame hinzugefügt.

Nochmals Danke für deine Mühe!
 
Hallo Nicole,

schau mal hier:
Java:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class CopyAndPaste extends JFrame {

	private JPanel p = new JPanel();

	public CopyAndPaste() {
		this.setTitle(this.getClass().getCanonicalName());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		p.setLayout(new GridLayout(3, 2));
		for (int i = 0; i < 6; i++) {
			p.add(new JTextField(15));
		}

		this.add(new MyToolBar(this), BorderLayout.NORTH);
		this.add(p, BorderLayout.CENTER);

		this.pack();
		this.setVisible(true);
	}

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

	class MyToolBar extends JToolBar implements ActionListener {

		private JButton b1 = new JButton("Copy");

		private JButton b2 = new JButton("Paste");

		private JFrame f;

		public MyToolBar(JFrame f) {
			this.f = f;
			this.add(b1);
			this.add(b2);

			b1.addActionListener(this);
			b2.addActionListener(this);

			b1.setFocusable(false);
			b2.setFocusable(false);
		}

		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == b1)
				copy();
			else
				paste();
		}

		public void copy() {
			JTextField tf = (JTextField) f.getFocusOwner();
			tf.copy();
		}

		public void paste() {
			JTextField tf = (JTextField) f.getFocusOwner();
			tf.paste();
		}
	}
}


Vg Erdal
 
Hallo,
das hat alles super geklappt.
Aber jetzt wollte ich die gleichen Methoden von dem Menu aus nutzen. Dabei habe ich das Problem, dass ich als FocusOwner nur das RootPane und nicht das bestimmte Textfeld bekomme.

Danke und Grüße,

Nicole
 
Zurück